所以我有一些按钮,我已经通过Interface Builder添加到视图中,而不是使用我自定义的系统按钮。我试图弄清楚如何改变特征,例如在不同状态(突出显示,聚焦等)期间的文本颜色和背景颜色。
似乎我不能通过IB做到这一点所以我可能会创建一个UIButton的子类并在那里更改它们,但是我很难找到要更改的属性。我没有在文档中明确提到它们
答案 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设置每个状态的属性会更容易。虽然设置略微隐藏,但您确实可以更改文本颜色和背景颜色。
您可以使用以下方法在代码中执行相同的操作:
[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)
}