Как установить пользовательский вид заголовка в центр панели навигации - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь добавить пользовательский вид (метку) как вид заголовка элемента навигации.

, но он не отображается в центре

func setupNavigationMultilineTitle(title:String) {
        let autoscrollLabel = EFAutoScrollLabel()
        autoscrollLabel.text =  title
        autoscrollLabel.textAlignment = .center
        autoscrollLabel.backgroundColor = .red

        autoscrollLabel.font = AppTheme.Fonts.font(type: .Medium, size: 15)
        autoscrollLabel.textColor = AppTheme.Colors.ColorsOfApp.header_color.color
        autoscrollLabel.frame = CGRect(x: 0, y: 0, width:((self.navigationController?.navigationBar.frame.size.width ?? 0) - (self.navigationItem.leftBarButtonItem?.customView?.frame.width ?? 0) * 2) , height: 40)
        self.navigationItem.titleView = autoscrollLabel

    }

Я пытался использовать вычесть ширину пользовательского вида, чтобы показать его в центре, но, к сожалению, он не работает.

Я также пытался получить self.navigationItem.leftBarButtonItem.width, но он возвращает 0. Я подтвердил, что есть элемент leftBarbutton с po self.navigationItem.leftBarButtonItem

EDIT

Это решает проблему

    autoscrollLabel.frame = CGRect(x: self.view.center.x - 125, y: 0, width: 250 , height: 40)

Но мне нужно динамическое решение

enter image description here

Любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Я отладил ваш сценарий, надеюсь, он поможет вам и другим разработчикам,

Когда мы назначаем ширину 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

Случай 2: arrLeftItems.count = 0 и arrRightItems.count = 1.

enter image description here


Надеюсь, что приведенные выше случаи прояснят вам то, что мы ожидаем и что мы получаем, и расчет, который я написал впервый абзац т.е. titleview.x = rightItem.x - width.

Вывод:

Если rightBarItems имеет больше элементов, чем leftBarItems, тогда titleview будет в центре, поэтому вам не нужно ничего делать, но если leftBarItems будет иметь больше элементов, чем rightBarItems, тодобавьте пустые элементы в правой части, чтобы сбалансировать их.Это странно для разработчиков, но кажется, что это единственное решение.

Проверьте окончательный вывод.

  • Просмотр Heirarchy

enter image description here

  • Выход

enter image description here

0 голосов
/ 14 февраля 2019

Если ваш элемент навигации является частью UINavigationController, вы можете попробовать self.navigationController?.navigationBar.topItem?.leftBarButtonItem?.width ?? 0.0

...