我想使用的UI测试SKSpriteKit
.
由于我的第一次尝试不起作用,我想知道是否可以使用SpriteKit进行Xcode UI测试.
主要思想是为要进行UI测试的元素创建辅助功能材料.那是意味着:
列出场景中包含的所有可访问元素
配置每个元素的设置,尤其是frame
数据.
这个答案适用于Swift 3,主要基于Sprite Kit的Accessibility(Voice Over)
假设我想让SpriteKit按钮名为tapMe
accessible.
添加一个UIAccessibilityElement
到Scene 的数组.
var accessibleElements: [UIAccessibilityElement] = []
我需要更新两个方法:didMove(to:)
和willMove(from:)
.
override func didMove(to view: SKView) { isAccessibilityElement = false tapMe.isAccessibilityElement = true }
由于场景是可访问控制,文档说,它必须返回False
到isAccessibilityElement
.
和:
override func willMove(from view: SKView) { accessibleElements.removeAll() }
3种方法涉及:accessibilityElementCount()
,accessibilityElement(at index:)
和index(ofAccessibilityElement
.请允许我介绍一下initAccessibility()
我稍后会介绍的方法.
override func accessibilityElementCount() -> Int { initAccessibility() return accessibleElements.count } override func accessibilityElement(at index: Int) -> Any? { initAccessibility() if (index < accessibleElements.count) { return accessibleElements[index] } else { return nil } } override func index(ofAccessibilityElement element: Any) -> Int { initAccessibility() return accessibleElements.index(of: element as! UIAccessibilityElement)! }
func initAccessibility() { if accessibleElements.count == 0 { // 1. let elementForTapMe = UIAccessibilityElement(accessibilityContainer: self.view!) // 2. var frameForTapMe = tapMe.frame // From Scene to View frameForTapMe.origin = (view?.convert(frameForTapMe.origin, from: self))! // Don't forget origins are different for SpriteKit and UIKit: // - SpriteKit is bottom/left // - UIKit is top/left // y // ?????? ? // ? ? ? x // ?????? ???? // // x // ?????? ???? // ? ? ? // ?????? y ? // // Thus before the following conversion, origin value indicate the bottom/left edge of the frame. // We then need to move it to top/left by retrieving the height of the frame. // frameForTapMe.origin.y = frameForTapMe.origin.y - frameForTapMe.size.height // 3. elementForTapMe.accessibilityLabel = "tap Me" elementForTapMe.accessibilityFrame = frameForTapMe elementForTapMe.accessibilityTraits = UIAccessibilityTraitButton // 4. accessibleElements.append(elementForTapMe) } }
创建UIAccessibilityElement
于tapMe
计算设备坐标上的帧数据.别忘了它frame
的起源是UIKit的左上角
设置数据 UIAccessibilityElement
将其添加UIAccessibilityElement
到场景中所有可访问元素的列表中.
现在tapMe
可以从UI测试角度访问.
会议406,Xcode中的UI测试,WWDC 2015
睁大眼睛 - SpriteKit中的配音可访问性
如何在SpriteKit游戏中支持VoiceOver?| Apple开发者论坛
swift - 使用Sprite Kit的辅助功能(Voice Over) - Stack Overflow