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

Posted

技术标签:

【中文标题】SWIFT:在 TVOS 中退出收集时强制焦点引擎转到按钮【英文标题】:SWIFT: Force focus engine to go to button when quitting collection in TVOS 【发布时间】:2020-11-16 10:25:59 【问题描述】:

我已经以编程方式实现了这个:

    tableView 单元格列表。 每个 tableViewCell 包含一个 collectionView 及其下方的按钮。

现在发生了什么:

    焦点引擎位于集合视图上 用户向下滚动 除非我在焦点集合视图的最后一项上,否则焦点引擎会转到下一个集合视图,然后它会转到 VoirTout 按钮。

我想要的是:

    焦点引擎位于集合视图上 用户向下滚动 焦点引擎转到 Voir Tout 按钮

我已经看到几个使用preferredFocusEnvironments 的答案,如下所示:

 // Trying to force focus on button
    var voirToutButton:  CustomButton? = CustomButton(color: .red, titleString: "");
    override var preferredFocusEnvironments : [UIFocusEnvironment] 
        return [voirToutButton!]
    

然后在 viewDidLoad 中调用这些:

 // TRYING TO FORCE FOCUS ON VOIR TOUT BUTTON
setNeedsFocusUpdate()
updateFocusIfNeeded()

但是,就我而言,这没有任何效果。

【问题讨论】:

【参考方案1】:

我是这样解决的。我不确定这是最好的方法,但它确实有效:

class TableViewCell: UITableViewCell 

    var voirToutButton:  CustomButton? = CustomButton(color: .red, titleString: "");
    var shouldRefocusToVoirToutButton:Bool = false
    override var preferredFocusEnvironments : [UIFocusEnvironment] 
            return [voirToutButton!]
    
    override func shouldUpdateFocus(in context: UIFocusUpdateContext) -> Bool 
        if (self.shouldRefocusToVoirToutButton)
            // Resetting this to false in order to avoid the focus getting stuck on voirToutButton
            self.shouldRefocusToVoirToutButton = false
                    self.setNeedsFocusUpdate()
                   self.updateFocusIfNeeded()
        
        return true
        
    


extension TableViewCell: UICollectionViewDelegate, UICollectionViewDataSource 

    func collectionView(_ collectionView: UICollectionView, shouldUpdateFocusIn context: UICollectionViewFocusUpdateContext) -> Bool 
       
        if let previouslyFocusedItemParent =  context.previouslyFocusedItem?.parentFocusEnvironment as? UICollectionView, let nextFocusedItemParent = context.nextFocusedItem?.parentFocusEnvironment as? UICollectionView  
          
 let isPreviousFocusInCurrentCollectionView = previouslyFocusedItemParent == self.moviesCollectionView
        let isNextFocusInCurrentCollectionView = nextFocusedItemParent == self.moviesCollectionView
        let isFocusLeavingCollectionView = !(isPreviousFocusInCurrentCollectionView == isNextFocusInCurrentCollectionView)
        let isFocusMovingDown:Bool =  !(context.focusHeading == .up)
        if (isFocusLeavingCollectionView && isFocusMovingDown) 
            self.shouldRefocusToVoirToutButton = true
        
        return true
        
            // I remove this else it says that I need to return a bool (!(
        else 
            print("If I remove this else it says that I need to return a bool (!(")
            return true
        
    
    

【讨论】:

以上是关于SWIFT:在 TVOS 中退出收集时强制焦点引擎转到按钮的主要内容,如果未能解决你的问题,请参考以下文章

TvOS 焦点引擎跳过单元

tvOS adjustsImageWhenAncestorFocused 裁剪图像收集视图单元格

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

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

tvos UISegmentedControl 焦点样式不变

在 tvOS 10 GM 上打开 UIAlertController 时焦点消失