在使用 Mac Catalyst 开发时遇到一个奇怪的问题,将 UISplitViewController.Style 设置为 doubleColumn 或者 tripleColumn 时,主控制器总是有一部分内容不显示,而出现在 window 外面。

window?.rootViewController = UISplitViewController(style: .doubleColumn)
// window?.rootViewController = UISplitViewController(style: .tripleColumn)

设置为 doubleColumn 时 设置为 tripleColumn 时

如上图,绿色部分超出 window 范围

不设置 UISplitViewController.Style 时,显示正常。

// 不设置 style 时,默认值似乎为 unspecified。但是将 style 设置为 unspecified 又会崩溃。
window?.rootViewController = UISplitViewController()

未设置 style 如上图,绿色部分正常显示

查阅资料后发现,苹果在 iOS 14 修改了 UISplitViewController 的行为。为了在主控制器显示完整内容,需要使用 safeArea 进行适配。 宛如 iOS 13 时,将 modalPresentationStyle 的默认值改为 pageSheet

tableView.snp.makeConstraints {
    $0.top.bottom.trailing.equalToSuperview()
    //$0.leading.equalToSuperview()
    $0.leading.equalTo(view.safeAreaLayoutGuide.snp.leading)
}

显示正常

如图,使用 safeArea 后,粉色的 tableView 显示正常,绿色的 self.view 依旧在游离在 window 之外。

参考资料

  1. UISplitViewController - doubleColumn Style not working
  2. iOS 14 UISplitViewController: 5 Issues That You May Run Into