在 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)
}
所以我有一些按钮是通过 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)
}