【问题标题】:Primary view controller not extending under top/bottom bars in split view controller主视图控制器未在拆分视图控制器的顶部/底部栏下扩展
【发布时间】:2017-03-13 05:12:57
【问题描述】:

在我的应用程序中,我在标签栏控制器中有一个拆分视图控制器,主视图控制器嵌入在导航控制器中。最初,详细视图控制器只是一个空白视图控制器。现在从 1 列分离到 2 列后,位于主要位置的视图控制器奇怪地不再延伸到顶部和底部栏下方。这些栏是半透明的,因此您应该能够在导航栏和标签栏中看到红色。我已经将问题缩小到splitViewController(_:separateSecondaryFrom:),我用它来将细节嵌入到导航控制器中。不过,我不明白为什么这会导致主节点出现这种行为。我对这个方法的实现有什么问题?

在折叠的界面中,红色按预期出现在条形中:

扩展到两列后,红色不再出现在条形中:

func splitViewController(_ splitViewController: UISplitViewController, separateSecondaryFrom primaryViewController: UIViewController) -> UIViewController? {
    //in the case where it's separating into two, we want to embed the detail in a navigation controller
    let primaryNavController = primaryViewController as! UINavigationController

    let detailController: UIViewController
    if primaryNavController.viewControllers.count > 1 {
        detailController = primaryNavController.viewControllers[1]
    } else {
        detailController = ViewController()
    }

    return UINavigationController(rootViewController: detailController)
}

I've uploaded a sample project here.

【问题讨论】:

    标签: ios uisplitviewcontroller


    【解决方案1】:

    在绘制条形下方视图的半透明和模糊时可能会出现问题。可能是由于框架中的一些绘图和缓存优化,但是当我在导航栏上触发 bar hidden 和 show 事件时,它很好。

    func splitViewController(_ splitViewController: UISplitViewController, separateSecondaryFrom primaryViewController: UIViewController) -> UIViewController? {
        //in the case where it's separating into two, we want to embed the detail in a navigation controller
        let primaryNavController = primaryViewController as! UINavigationController
    
        let detailController: UIViewController
        if primaryNavController.viewControllers.count > 1 {
            detailController = primaryNavController.viewControllers[1]
        } else {
            detailController = ViewController()
        }
        //Fake trigger to force bars to draw blur translucency
        let navigationNew = UINavigationController(rootViewController: detailController)
        navigationNew.setNavigationBarHidden(true, animated: false)
        navigationNew.setNavigationBarHidden(false, animated: false)
        return navigationNew
    }
    

    让我知道它是否适合你。

    【讨论】:

    • 奇怪...它的工作原理。也可以做setNeedsLayout()layoutIfNeeded()。嗯,是时候提交错误报告了。
    • 是的,任何可能触发重新绘制导航视图层次结构的事件都应该这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    相关资源
    最近更新 更多