在 Swift (tvOS) 中,如何更改 UIButton 的突出显示和焦点颜色?
Posted
技术标签:
【中文标题】在 Swift (tvOS) 中,如何更改 UIButton 的突出显示和焦点颜色?【英文标题】:In Swift (tvOS) how do you change a UIButton's highlight and focus colors? 【发布时间】:2016-01-06 21:43:37 【问题描述】:因此,我通过 Interface Builder 添加了一些按钮,而不是使用自定义的系统按钮。我试图弄清楚如何在不同状态(突出显示、聚焦等)期间更改特征,例如文本颜色和背景颜色。
我似乎无法通过 IB 来做到这一点,所以我可能会创建 UIButton 的子类并在那里更改它们,但我很难找到要更改的属性。我没有看到文档中明确提到它们
【问题讨论】:
【参考方案1】:你绝对是在正确的轨道上!
一旦你继承了 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
您还可以花哨并变换框架以模仿默认的“焦点”效果!
【讨论】:
对于 Swift 3.0 将前两行更改为以下:override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) super.didUpdateFocus(in: context, with: coordinator)
【参考方案2】:
@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】:除了@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()
【讨论】:
【参考方案4】:以上两个答案都有效,但对于如此简单的更改,使用 IB 为每个状态设置属性更容易。虽然设置稍微隐藏,但您确实可以更改文本颜色和背景颜色。
您可以使用以下方法在代码中执行相同的操作:
[aButton setTitleColor:UIColor.greenColor forState:UIControlStateFocused];
【讨论】:
【参考方案5】:斯威夫特 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 (tvOS) 中,如何更改 UIButton 的突出显示和焦点颜色?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 tvOS 上使用 Youtube API 嵌入实时流