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 adjustsImageWhenAncestorFocused 裁剪图像收集视图单元格
在 tvos 中更改焦点时如何关闭 UISearchController 中的键盘?