swift – 使用Sprite Kit的辅助功能(Voice Over)
发布时间:2020-12-14 04:57:39 所属栏目:百科 来源:网络整理
导读:我试图在具有固定板的益智游戏中添加对Voice Over accessibility的支持.但是,我无法让UIAccessibilityElements显示出来. 现在我在我的SKScene中覆盖了accessibilityElementAtIndex,accessibilityElementCount和indexOfAccessibilityElement. 他们返回一组可
我试图在具有固定板的益智游戏中添加对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) } 现在,一个(尺寸错误的)辅助功能元素似乎出现在屏幕上错误的地方. 有人能指出我正确的方向吗? 非常感谢 编辑: 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 SKSceneScaleMode.Fill 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)! } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |