在 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 swift 的替代方案

SWIFT:在 TVOS 中退出收集时强制焦点引擎转到按钮

月份更改时的 uib-datepicker 警报

如何在 tvOS 上使用 Youtube API 嵌入实时流

tvOS 14.3 UISearchController:如何锁定显示

如何快速解析 TVos 中返回的 CKSubscription 用户信息字段