使用Sprite Kit的辅助功能(配音)

时间:2015-05-12 13:09:49

标签: swift sprite-kit skspritenode uiaccessibility

我正在尝试在具有固定主板的益智游戏中添加对Voice Over辅助功能的支持。但是,我无法显示UIAccessibilityElements

现在我在我的SKScene中覆盖了accessibilityElementAtIndexaccessibilityElementCountindexOfAccessibilityElement

他们正在返回一系列可访问元素:

func loadAccessibleElements()
{
    self.isAccessibilityElement = false

    let pieces = getAllPieces()

    accessibleElements.removeAll(keepCapacity: false)
    for piece in pieces
    {
        let element = UIAccessibilityElement(accessibilityContainer: self.usableView!)

        element.accessibilityFrame = piece.getAccessibilityFrame()
        element.accessibilityLabel = piece.getText()
        element.accessibilityTraits = UIAccessibilityTraitButton
        accessibleElements.append(element)
    }
}

其中piece是SKSpriteNode的子类,getAccessibilityFrame定义为:

func getAccessibilityFrame() -> CGRect
{
    return parentView!.convertRect(frame, toView: nil)
}

现在,一个(尺寸错误的)accessibility元素似乎出现在屏幕上错误的位置。

有人能指出我正确的方向吗?

非常感谢

编辑:
我已经尝试了一个hack-ish工作,将UIView放在SKView上,UIButton元素放在与SKSpriteNodes相同的位置。但是,可访问性仍然不希望工作。视图加载如下:

func loadAccessibilityView()
{
    view.isAccessibilityElement = false
    view.accessibilityElementsHidden = false
    skView.accessibilityElementsHidden = false
    let accessibleSubview = UIView(frame: view.frame)
    accessibleSubview.userInteractionEnabled = true
    accessibleSubview.isAccessibilityElement = false
    view.addSubview(accessibleSubview)
    view.bringSubviewToFront(accessibleSubview)

    let pieces = (skView.scene! as! GameScene).getAllPieces()
    for piece in pieces
    {
        let pieceButton = UIButton(frame: piece.getAccessibilityFrame())
        pieceButton.isAccessibilityElement = true
        pieceButton.accessibilityElementsHidden = false
        pieceButton.accessibilityTraits = UIAccessibilityTraitButton
        pieceButton.setTitle(piece.getText(), forState: UIControlState.Normal)
        pieceButton.setBackgroundImage(UIImage(named: "blue-button"), forState: UIControlState.Normal)
        pieceButton.alpha = 0.2
        pieceButton.accessibilityLabel = piece.getText()
        pieceButton.accessibilityFrame = pieceButton.frame
        pieceButton.addTarget(self, action: Selector("didTap:"), forControlEvents: UIControlEvents.TouchUpInside)
        accessibleSubview.addSubview(pieceButton)
    }

    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil)

}

按钮放置正确,但可访问性根本无法正常工作。似乎有些东西阻止它起作用。

2 个答案:

答案 0 :(得分:2)

我徒劳地搜索了如何使用SpriteKit在Swift中实现VoiceOver的描述,所以我终于想出了如何做到这一点。这里有一些工作代码,可以在添加到SKScene类时将SKNode转换为可访问的按钮:

if ( $testip =~ /$ip/ ) {
    $frequency++;
}
elsif ( $ip ne $testip ) {

答案 1 :(得分:0)

辅助功能框架在固定的物理屏幕坐标中定义,而不是UIView坐标,并且在它们之间进行转换有点棘手。

当设备处于横向右侧模式时,设备原点位于屏幕的左下方,X为up。

这是一次痛苦的转变,我不知道苹果为何会这样做。