在Swift(tvOS)中,如何更改UIButton';什么是高光和聚焦颜色?

在Swift(tvOS)中,如何更改UIButton';什么是高光和聚焦颜色?,swift,uibutton,interface-builder,tvos,Swift,Uibutton,Interface Builder,Tvos,因此,我有一些通过界面生成器添加到视图中的按钮,我没有使用系统按钮,而是对它们进行了自定义。我试图弄清楚如何改变特征,例如在不同状态(突出显示、聚焦等)下的文本颜色和背景颜色 似乎我不能通过IB来完成,所以我可能会创建UIButton的子类并在那里更改它们,但我很难找到要更改的属性。我没有看到文档中明确提到它们您的思路绝对正确 将UIButton子类化后,可以覆盖函数didUpdateFocusInText(来自UIFocusEnvironment协议,该协议在tvOS上已经实现了UIButto

因此,我有一些通过界面生成器添加到视图中的按钮,我没有使用系统按钮,而是对它们进行了自定义。我试图弄清楚如何改变特征,例如在不同状态(突出显示、聚焦等)下的文本颜色和背景颜色


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

您的思路绝对正确

将UIButton子类化后,可以覆盖函数
didUpdateFocusInText
(来自
UIFocusEnvironment
协议,该协议在tvOS上已经实现了
UIButton


你也可以想象和变换帧来模仿默认的“焦点”效果

除了@Yoseob Lee的答案之外,您不需要创建UIButton子类来实现这一点。只需确保在Interface Builder中为UIButton类型选择
custom
,然后在要更改按钮属性的类中重写
DidUpdateFocusInText
方法:

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];
答案是正确的,但他的回答缺少一些细节。这里有一个稍微好一点的(主观的)答案


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

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)

}

这使过渡变得平滑。像黄油一样光滑。完美!答案应该改为:)将Swift 3.0的前两行更改为以下内容:
override func didUpdateFocus(在上下文中:UIFocusUpdateContext,带协调器:UIFocusAnimationCoordinator){super.didUpdateFocus(在上下文中,带协调器)
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)
    }
}
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)

}