在 Swift (tvOS) 中,如何更改 UIButton 的突出显示和焦点颜色?

In Swift (tvOS) how do you change a UIButton's highlight and focus colors?

所以我有一些按钮是通过 Interface Builder 添加到视图中的,而不是使用我自定义的系统按钮。我试图弄清楚如何在不同状态(突出显示、聚焦等)期间更改特性,例如文本颜色和背景颜色。

我似乎无法通过 IB 完成此操作,因此我可能会创建 UIButton 的子类并在那里更改它们,但我无法找到要更改的属性。我没有看到文档中明确提到它们

你绝对是在正确的轨道上!

一旦将 UIButton 子类化,就可以覆盖函数 didUpdateFocusInContext(来自 UIFocusEnvironment 协议,UIButton 在 tvOS 上已经实现)

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
    super.didUpdateFocusInContext(context, withAnimationCoordinator: coordinator)

    if context.nextFocusedView == self {
        // This is when the button will be focused
        // You can change the backgroundColor and textColor here
    } else {
        // This is when the focus has left and goes back to default
        // Don't forget to reset the values
    }
}

你也可以花点心思,变换框架来模仿默认的"focus"效果!

除了@Yoseob Lee 的回答之外,您不需要创建 UIButton subclass 来实现此目的。只需确保在 Interface Builder 中为 UIButton Type select custom,然后在要更改按钮属性的 class 中覆盖 didUpdateFocusInContext 方法:

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
    super.didUpdateFocusInContext(context, withAnimationCoordinator: coordinator)

    if context.nextFocusedView == myButton {
        myButton = UIColor.redColor()
    } else {
        myButton = UIColor.blueColor()
    }
}

以上两个答案都有效,但对于这种简单的更改,使用 IB 为每个状态设置属性会更容易。虽然设置有点隐藏,但您确实可以更改文本颜色和背景颜色。

您可以使用以下方法在代码中执行相同的操作:

[aButton setTitleColor:UIColor.greenColor forState:UIControlStateFocused];

@Yoseob Lee 是正确的,但他的回答缺少一些细节。这是稍微 更好的 (主观)答案。

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
    if context.nextFocusedView === self {
        coordinator.addCoordinatedAnimations({ 
            // change the appearance as desired
            }, completion: nil)
    } else if context.previouslyFocusedView === self {
        coordinator.addCoordinatedAnimations({ 
            // revert back to default appearance
            }, completion: nil)
    }
}

请注意 === 而不是 == 进行比较。在大多数情况下,比较参考更快。此外,将任何外观更改添加到动画协调器组更改为默认动画(和时间),以便外观更改看起来更像是 tvOS 默认行为的一部分。此外,确保仅 previouslyFocusedView 恢复为默认状态可减少不必要的操作。

Swift 3

swift 3.0 中的实现:

override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {

    coordinator.addCoordinatedAnimations({
        if self.isFocused {
            self.button.alpha = 1.0 // in focus 
        }
        else {
            self.button.alpha = 0.0 // leaving focus
        }
        }, completion: nil)

}