如何禁用默认的 tvOS 焦点动画?

Posted

技术标签:

【中文标题】如何禁用默认的 tvOS 焦点动画?【英文标题】:How can I disable the default tvOS focus animations? 【发布时间】:2016-08-25 21:06:25 【问题描述】:

我需要创建一个混合了UITableViewUITextField 和一些自定义UIView 的用户界面,并且我还需要提供自定义焦点动画。

如何让UITableView/UITableViewCellUITextField 不呈现默认焦点动画?

我试过了:

    override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) 
        if let view = context.previouslyFocusedView 
            view.layer.removeAllAnimations()
        
        if let view = context.nextFocusedView 
            view.layer.removeAllAnimations()
        
    

我可以添加自己的动画,但无法从视图中删除“默认”动画。

【问题讨论】:

如果你对它们进行子类化,你应该能够覆盖动画。 我尝试覆盖/删除动画无济于事。 描述你看到的动画。将您的代码放在UITableViewCell 子类中为我删除了所有动画。虽然removeAllAnimations() 调用是不必要的。 我指的是 tvOS 为当前聚焦的视图绘制的略微放大和阴影效果。 你发现了吗? @pstoppani 【参考方案1】:

将单元格的焦点样式更改为自定义而不是默认。

cell.focusStyle = UITableViewCellFocusStyle.custom

【讨论】:

【参考方案2】:

要从 UITableViewCells 中移除焦点,请使用以下代码:

 func tableView(_ tableView: UITableView, canFocusRowAt indexPath: IndexPath) -> Bool 
    return false

【讨论】:

这是不正确的。问题是如何禁用默认的焦点动画而不阻止焦点在一个项目上。【参考方案3】:

我已经解决了与您的问题类似的问题,但我的UITableView 只有一个UITableViewCell。因此,当 UIViewController 存在/加载时,没有聚焦的 UITableViewCell 并且当我单击单元格时它执行其操作(呈现一个 UIAlertController

    if let focusedCell = UIScreen.main.focusedView as? MyCell

         focusedCell.backgroundColor = UIColor.clear
    

然后

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

    // take action
    ... alertController configuration
    present(alertController, animated: true, completion: 

          tableView.reloadData()

    )


当表格重新加载自身时,它会转换其未聚焦的形式,并且循环会自行重复。

【讨论】:

以上是关于如何禁用默认的 tvOS 焦点动画?的主要内容,如果未能解决你的问题,请参考以下文章

TVOS 10 SpriteKit 焦点导航默认焦点项目

如何在 tvOS 中对按钮焦点执行动作事件

在 tvos 中更改焦点时如何关闭 UISearchController 中的键盘?

如何在 SwiftUI 中使 UIViewRepresentable 在 tvOS 上具有焦点?

在 Swift (tvOS) 中,如何更改 UIButton 的突出显示和焦点颜色?

如何在 tvos 应用程序的 collectionview 单元格中的按钮上移动焦点?