Search code examples
swifttvosapple-tvfocus-engine

How to make a UIView focusable using the focus engine on Apple TV


Is it possible to make a UIView focusable? Or should I just use a custom UIButton for all possible views?

I tried to override canBecomeFocused but nothing happened.


Solution

  • So the problem was that I didn't notice that my cell got focus. To wrap this up, you need to implement

    1) override canBecomeFocused

    2) override "didUpdateFocusInContext:withAnimationCoordinator:" method to be able to highlight the cell as focused

    Swift 2.3:

    override func canBecomeFocused() -> Bool {
        return true
    }
    
    override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
    
        if context.nextFocusedView == self {
            coordinator.addCoordinatedAnimations({ () -> Void in
                self.layer.backgroundColor = UIColor.blueColor().colorWithAlphaComponent(0.2).CGColor
            }, completion: nil)
        } else if context.previouslyFocusedView == self {
            coordinator.addCoordinatedAnimations({ () -> Void in
                self.layer.backgroundColor = UIColor.clearColor().CGColor
            }, completion: nil)
        }
    }
    

    Swift 3:

    override var canBecomeFocused: Bool {
        return true
    }
    
    override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
        if context.nextFocusedView == self {
            coordinator.addCoordinatedAnimations({ () -> Void in
                self.layer.backgroundColor = UIColor.blue.withAlphaComponent(0.2).cgColor
            }, completion: nil)
    
        } else if context.previouslyFocusedView == self {
            coordinator.addCoordinatedAnimations({ () -> Void in
                self.layer.backgroundColor = UIColor.clear.cgColor
            }, completion: nil)
        }
    }