0

我有一个 UIViewController 作为 UINavigationController 的根,我设置了大标题的首选项,如下所示navigationController?.navigationBar.prefersLargeTitles = true

我的目标是将视图的左侧与导航标题的左侧对齐,但我想动态而不是通过硬编码值来实现。这是所需的最终结果:

UINavigationBar 对齐

我尝试使用检索导航栏标题的左侧或 x 位置

let navigationLeftX = navigationController!.navigationBar.layoutMargins.left

我还打印了这个值并得到了值8.0

所以我想,我应该把它设置为创建的视图的 x 位置,它应该对齐,我的代码在viewWillAppear

// Create a demo view
let demoView = UIView()
view.addSubview(demoView)
demoView.backgroundColor = .orange

// Get the current left margin of the nav title
let navigationLeftX = navigationController!.navigationBar.layoutMargins.left

// Add constraints to your view
demoView.translatesAutoresizingMaskIntoConstraints = false
demoView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: navigationLeftX).isActive = true
demoView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
demoView.widthAnchor.constraint(equalToConstant: 100).isActive = true
demoView.heightAnchor.constraint(equalToConstant: 100).isActive = true

结果很接近,但仍然很差。

UINavigationController UINavigationBar 与子视图对齐

如果我将边距 x 值加倍,它似乎正确对齐

// Get the current left margin of the nav title
let navigationLeftX = navigationController!.navigationBar.layoutMargins.left * 2

UINavigationBar 对齐 Swift

所以我正要得出结论,除了 8 点的左边距之外,还有一个额外的 8 点填充,逻辑上认为,如果我将导航的左边距设置为 0,我应该会看到 8 点的填充,所以我做了:

navigationController!.navigationBar.layoutMargins.left = 0

但令我惊讶的是,它实际上位于屏幕的左边缘,没有任何填充:

UINavigationBar 标题填充边距对齐

任何人都可以解释这种行为并分享动态对齐视图与导航栏标题的最佳方式吗?

提前致谢

4

1 回答 1

0

另一个用户问了一个类似的问题

我遇到了两种可能赋予此价值的方法:

1.遍历导航栏层次结构

var leftMargin: CGFloat = 0.0

for view in navigationController!.navigationBar.subviews
{
    if let classToFind = NSClassFromString("_UINavigationBarLargeTitleView"),
       view.isKind(of: classToFind)
    {
        leftMargin = view.layoutMargins.left
    }
}

// Set your left margin of view to align to leftMargin variable

这里的两个未知数是我不确定这是否是在查询私有类以及是否可以。第二件事是,这个类名可能会在未来的 iOS 版本中改变。

2.systemMinimumLayoutMargins

我遇到的另一件事是获取systemminimumlayoutmargins,您可以这样做:

var leftMargin = navigationController!.systemMinimumLayoutMargins.leading

// Set your left margin of view to align to leftMargin variable

这给出了一个有效的值,但是我不确定这是否是描述标题左侧值的预期用途

我不会将此标记为已回答,以防有人提出更好的解决方案,但只是为任何可能有帮助的人指出这一点。

于 2022-01-22T09:48:47.570 回答