我试图在具有固定板的益智游戏中添加对Voice Over accessibility的支持.但是,我无法让UIAccessibilityElements显示出来.
现在我在我的SKScene中覆盖了accessibilityElementAtIndex,accessibilityElementCount和indexOfAccessibilityElement.
他们返回一组可访问的元素:
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) }
现在,一个(尺寸错误的)辅助功能元素似乎出现在屏幕上错误的地方.
有人能指出我正确的方向吗?
非常感谢
编辑:
我已经尝试了一个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) }
按钮放置正确,但可访问性根本无法正常工作.似乎有些东西阻止它起作用.
解决方法
我搜索到如何使用SpriteKit在Swift中实现VoiceOver的描述是徒劳的,所以我终于想出了如何做到这一点.这里有一些工作代码,可以在添加到SKScene类时将SKNode转换为可访问的按钮:
// Add the following code to a scene where you want to make the SKNode variable named “leave” an accessible button // leave must already be initialized and added as a child of the scene,or a child of other SKNodes in the scene // screenHeight must already be defined as the height of the device screen,in points // Accessibility private var accessibleElements: [UIAccessibilityElement] = [] private func nodetoDevicePointsFrame(node: SKNode) -> CGRect { // first convert from frame in SKNode to frame in SKScene's coordinates var sceneFrame = node.frame sceneFrame.origin = node.scene!.convertPoint(node.frame.origin,fromNode: node.parent!) // convert frame from SKScene coordinates to device points // sprite kit scene origin is in lower left,accessibility device screen origin is at upper left // assumes scene is initialized using SKSce@R_404[email protected] using dimensions same as device points var deviceFrame = sceneFrame deviceFrame.origin.y = CGFloat(screenHeight-1) - (sceneFrame.origin.y + sceneFrame.size.height) return deviceFrame } private func initaccessibility() { if accessibleElements.count == 0 { let accessibleLeave = UIAccessibilityElement(accessibilityContainer: self.view!) accessibleLeave.accessibilityFrame = nodetoDevicePointsFrame(leave) accessibleLeave.accessibilityTraits = UIAccessibilityTraitButton accessibleLeave.accessibilityLabel = “leave” // the accessible name of the button accessibleElements.append(accessibleLeave) } } override func didMovetoView(view: SKView) { self.isAccessibilityElement = false leave.isAccessibilityElement = true } override func willMoveFromView(view: SKView) { accessibleElements = [] } override func accessibilityElementCount() -> Int { initaccessibility() return accessibleElements.count } override func accessibilityElementAtIndex(index: Int) -> AnyObject? { initaccessibility() if (index < accessibleElements.count) { return accessibleElements[index] as AnyObject } else { return nil } } override func indexOfAccessibilityElement(element: AnyObject) -> Int { initaccessibility() return accessibleElements.indexOf(element as! UIAccessibilityElement)! }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。