UINavigationBar titleView 居中问题

最近遇到一个 UINavigationBar 的 titleView 问题。自定义了一个 UIView,将其赋值给 navigationItem.titleView 。但是在 iOS 8 和 iOS 9 上导航栏并不能居中问题。但是 iOS 10 和 iOS 11 是可以正常居中。那么怎么解决呢?

先上代码吧。自定义了一个 titleView,并使用了 SnapKit 进行内部组件的约束处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let titleView = UIView(frame: .zero)
titleView.backgroundColor = .red
let lbl = UILabel(frame: .zero)
lbl.text = "lblblblblbl"
titleView.addSubview(lbl)
lbl.snp.makeConstraints {
$0.leading.top.bottom.equalToSuperview()
}
let lbl2 = UILabel(frame: .zero)
lbl2.text = "ddddd"
lbl2.textColor = .white
titleView.addSubview(lbl2)
lbl2.snp.makeConstraints{
$0.top.bottom.equalTo(lbl)
$0.leading.equalTo(lbl.snp.trailing)
$0.trailing.equalToSuperview()
}
navigationItem.titleView = titleView
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: nil, action: nil)

用 Xcode 的 Capture View Hierarchy 查看下导航栏的 UI 层级。

在 iOS 8/9/10 ,titleView 的位置约束缺少,而 iOS 11,titleView 的会自动添加一个位置约束。

因此,可以模仿 iOS 11 下的 titleView 的约束。给 iOS 8/9/10 的 titleView 添加适当的约束。

1
2
3
4
5
6
7
8
9
10
if #available(iOS 11, *) { } else {
if let titleView = navigationItem.titleView {
titleView.snp.makeConstraints {
$0.centerX.centerY.equalToSuperview()
$0.bottom.lessThanOrEqualToSuperview()
$0.top.greaterThanOrEqualToSuperview()
}
}
}

一次无聊的 UI 实验。🤷‍♀️。