tvOS 上的 UISplitViewController - 禁用滑动到详细视图控制器

Posted

技术标签:

【中文标题】tvOS 上的 UISplitViewController - 禁用滑动到详细视图控制器【英文标题】:UISplitViewController on tvOS - Disable Swipe to Detail View Controller 【发布时间】:2016-06-25 21:37:36 【问题描述】:

一直在挖掘documentation,但我似乎找不到完成以下任务的方法。

我的SplitViewController 加载了UITableView 作为主控,但是我可以简单地向右滑动 Apple TV 遥控器以进入详细信息视图。如何禁用此手势,以便仅在主视图中进行选择后启用详细视图?

从文档中,var presentsWithGesture: Bool 听起来是正确的做法,但这仅适用于已经隐藏的视图。我的视图并排显示,两者都是可见的。有什么想法吗?

【问题讨论】:

【参考方案1】:

你可以在你的主视图控制器上创建一个属性来跟踪你是否想把焦点放在细节视图控制器上,比如:

var presentDetail = false

那么您应该覆盖shouldUpdateFocusInContext 以不允许焦点更新向右移动。

    override func shouldUpdateFocusInContext(context: UIFocusUpdateContext) -> Bool 
        if context.focusHeading == .Right  return false 
        return super.shouldUpdateFocusInContext(context)
    

接下来你需要覆盖preferredFocusedView:

override var preferredFocusedView: UIView?
    if self.presentDetail 
        self.presentDetail = false
        guard let vc = self.splitViewController?.viewControllers[1] else  return nil 
        return vc.view
    
    return self.tableView

通常我们会返回我们的 tableView,但是当我们想要将焦点转移到细节视图控制器时,我们会返回它的视图。

最后我们实现didSelectRowAtIndexPath:

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
        if let vc = self.splitViewController?.viewControllers[1] 
            self.presentDetail = true

            self.setNeedsFocusUpdate()
            self.updateFocusIfNeeded()

            vc.setNeedsFocusUpdate()
            vc.updateFocusIfNeeded()
        
    

我们请求更新主视图控制器和详细视图控制器上的焦点引擎。

【讨论】:

以上是关于tvOS 上的 UISplitViewController - 禁用滑动到详细视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

tvOS 上的 GCDWebServer

关注 tvOS 上的 UICollectionViewCells

更改 tvOS 上的菜单栏位置

SwiftUI - tvOS 上的 AVPlayerViewController 全屏

在 TVOS 上的 SwiftUI 布局中苦苦挣扎

SwiftUI - tvOS 上的列表 - 顶部渐变