I am trying to add Voice Over accessibility support in a fixed-board puzzle. However, I am unable to get the UIAccessibilityElements .
Now I am redefining accessibilityElementAtIndex , accessibilityElementCount and indexOfAccessibilityElement in my SKScene.
They return an array of available elements as such:
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) } }
Where the piece is a subclass of SKSpriteNode and getAccessibilityFrame is defined:
func getAccessibilityFrame() -> CGRect { return parentView!.convertRect(frame, toView: nil) }
Currently, one (wrong size) accessibility element seems to appear on the screen in the wrong place.
Can someone point me in the right direction?
Many thanks
EDIT:
I tried working with hack-ish by placing a UIView on an SKView with UIButton elements in the same place as SKSpriteNodes. However, accessibility still does not want to work. The view is loaded as such:
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) }
The buttons are positioned correctly, but accessibility just doesn't work. Something seems to be stopping him from working.