Я отладил ваш сценарий, надеюсь, он поможет вам и другим разработчикам,
Когда мы назначаем ширину tittleView, вычисляя пространство, оставшееся после вычитания пространства элементов, полей, отступов и т. Д., Тогда iOS вычисляет titleView X справасторона, то есть titleview.x = rightItem.x - width
, и мы ожидаем, что это titleview.x = navbar.width/2 - width/2
.
Пожалуйста, посмотрите ниже примеры тестовых случаев.
Расчет ширины
let maxItemOnEitherSide = max(arrLeftItems.count, arrRightItems.count)
let widthOfItem : CGFloat = 30.0
let pading : CGFloat = 40
let aWidth : CGFloat = (self.navigationController?.navigationBar.frame.width)! - CGFloat(maxItemOnEitherSide) * widthOfItem * 2.0 - pading
let lblNavTitle = UILabel(frame: CGRect(x: 0, y: 0,
width: aWidth,
height: 40))
Случай 1: arrLeftItems.count = 1 и arrRightItems.count = 0.
Вывод:
![enter image description here](https://i.stack.imgur.com/Xejqr.png)
Случай 2: arrLeftItems.count = 0 и arrRightItems.count = 1.
![enter image description here](https://i.stack.imgur.com/QcGxs.png)
Надеюсь, что приведенные выше случаи прояснят вам то, что мы ожидаем и что мы получаем, и расчет, который я написал впервый абзац т.е. titleview.x = rightItem.x - width
.
Вывод:
Если rightBarItems имеет больше элементов, чем leftBarItems, тогда titleview будет в центре, поэтому вам не нужно ничего делать, но если leftBarItems будет иметь больше элементов, чем rightBarItems, тодобавьте пустые элементы в правой части, чтобы сбалансировать их.Это странно для разработчиков, но кажется, что это единственное решение.
Проверьте окончательный вывод.
![enter image description here](https://i.stack.imgur.com/CouPP.png)