7

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.

Pavel Smejkal
  • 3,600
  • 6
  • 27
  • 45
  • 1
    yes, any UIView is focusable using canBecomeFocused. However, you also need to override the didUpdateFocusInContext method to display the focus. – Mike M Oct 12 '15 at 11:15
  • you MUST also add **isUserInteractionEnabled = true** – Fattie Jul 07 '22 at 19:53

3 Answers3

18

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)
    }
}
Pavel Smejkal
  • 3,600
  • 6
  • 27
  • 45
3

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

override var canBecomeFocused : Bool { return true }

Rados
  • 481
  • 4
  • 17
0

Swift 3 version of Pavel's code:

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)
    }
}
Justin Vallely
  • 5,932
  • 3
  • 30
  • 44