是否有 Swift 缩进导航栏大标题与 cellLayoutMarginsFollowReadableWidth 一致的方法?

Is there a Swift method for indenting the large title of a navigation bar in line with cellLayoutMarginsFollowReadableWidth?

目前,在 iPad,我的 UINavigationBar 大标题看起来很奇怪,因为它没有缩进到我的 UITableView 单元格所在的位置。这是因为我的 table 视图和单元格遵循可读宽度。有没有缩进这个标题的方法,或者是唯一一条将单元格与标题对齐的建议(使它们不遵循可读宽度)。我真的很感激任何花时间回复的人。

当您第一次加载视图控制器时,您应该检索当前 readableContentGuideminX 坐标并将该值设置为左侧的 layoutMargin 值。因此:

let leftMargin = self.view.readableContentGuide.layoutFrame.minX    
self.navigationController?.navigationBar.layoutMargins.left = leftMargin

然后,您还需要确保您的布局动态调整,以便在用户旋转屏幕时(或在 iPad 上使用变量 window 大小)标题将保持对齐:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    coordinator.animate(alongsideTransition: { _ in
        let leftMargin = view.readableContentGuide.layoutFrame.minX    
        navigationController?.navigationBar.layoutMargins.left = leftMargin
    }, completion: nil)
}

@swillsea 的回答对我来说效果不佳:旋转设备时,大标题的左边距在旋转动画期间似乎有错误的初始位置。人们可以在启用了慢速动画选项的模拟器中看到这一点。

这是因为屏幕是使用旧的左边距在新维度中布局的。在旋转动画期间,边距被动画化为正确的最终大小。

我没有在尺寸改变时更新左边距,而是作为正常布局链的一部分进行更新:

override func viewWillLayoutSubviews() {
    let leftMargin = self.view.readableContentGuide.layoutFrame.minX
    self.navigationController?.navigationBar.layoutMargins.left = leftMargin
}

对我来说现在的效果是,在旋转动画的所有阶段,标题的左边距现在等于我可读内容的左边距。