在Swift(tvOS)中,您如何更改UIButton的高光和焦点颜色?

时间:2016-01-06 21:43:37

标签: swift uibutton interface-builder tvos

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

似乎我不能通过IB做到这一点所以我可能会创建一个UIButton的子类并在那里更改它们,但是我很难找到要更改的属性。我没有在文档中明确提到它们

5 个答案:

答案 0 :(得分:6)

你肯定是在正确的轨道上!

一旦你继承了UIButton,你可以覆盖函数didUpdateFocusInContext(来自UIFocusEnvironment协议,tvOS已经实现了UIButton

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
    }
}

你也可以获得幻想并改变框架以模仿默认"焦点"实现!

答案 1 :(得分:4)

除了@Yoseob Lee的回答之外,您无需创建UIButton子类来实现此目的。只需确保在Interface Builder中为UIButton类型选择custom,然后覆盖要更改按钮属性的类中的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()
    }
}

答案 2 :(得分:4)

@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恢复为默认状态可以减少不必要的操作。

答案 3 :(得分:2)

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

pop up to change state configuration

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

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

答案 4 :(得分:1)

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)

}