Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 341
Pavel Smejkal Avatar asked Oct 11 '15 23:10

Pavel Smejkal


2 Answers

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)
    }
}
like image 179
Pavel Smejkal Avatar answered Nov 19 '22 09:11

Pavel Smejkal


It seems that things had changed and now the correct way to make a view focusable is this:

override var canBecomeFocused : Bool { return true }

like image 3
Rados Avatar answered Nov 19 '22 10:11

Rados