Заголовок многострочной панели навигации

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

let titleLabel = UILabel()
titleLabel.frame = CGRectMake(0, 0, self.navigationBar.frame.width, self.navigationBar.frame.height * 2)
titleLabel.numberOfLines = 0
titleLabel.lineBreakMode = .ByWordWrapping

navigationItem.titleView = titleLabel

Но текст все равно убегает в конце. Я также попытался поместить это в отдельный контроллер представления, добавив self.navigationController?. перед navigationItem с теми же результатами.

Есть ли что-то, чего мне не хватает в моем коде, чтобы метка заголовка не использовала несколько строк?


person Cody Harness    schedule 15.12.2015    source источник
comment
Размер вашего navigationBar.frame.width, возможно, еще не соответствует размеру экрана. Вы можете переопределить viewDidLayoutSubviews, чтобы определить правильный кадр.   -  person Cœur    schedule 10.10.2016


Ответы (3)


Вот пример кода того, как вы можете создать многострочный заголовок navigationBar

let label: UILabel = UILabel(frame: CGRectMake(0, 0, 400, 50))
label.backgroundColor = UIColor.clearColor()
label.numberOfLines = 2
label.font = UIFont.boldSystemFontOfSize(16.0)
label.textAlignment = .Center
label.textColor = UIColor.whiteColor()
label.text = "This is a\nmultiline string for the navBar"
self.navigationItem.titleView = label

Swift 5.x:

let label = UILabel()
label.backgroundColor = .clear
label.numberOfLines = 2
label.font = UIFont.boldSystemFont(ofSize: 16.0)
label.textAlignment = .center
label.textColor = .white
label.text = "This is a\nmultiline string for the navBar"
self.navigationItem.titleView = label
person Rashwan L    schedule 15.12.2015
comment
Потребуется некоторая настройка, чтобы заставить его вести себя так, как я хочу, но это помогло. - person Cody Harness; 16.12.2015
comment
Я использовал navigationItem.titleView без явной установки фрейма, и он работает нормально. - person gutte; 16.01.2018
comment
@Rashwan L, если вы определяете фрейм UILabel, это приведет к выравниванию метки по левому краю, поэтому просто оставьте часть фрейма и используйте просто как let label = UILabel(). и он будет работать идеально и выровнять себя по центру. - person Azharhussain Shaikh; 24.01.2019

Это выполнимо в раскадровке. Просто перетащите UIView на панель навигации, затем перетащите на него UILabel в структуре документа, установите для строк значение 2 и выравнивание по центру.

введите здесь описание изображения

person foson    schedule 26.02.2018

Используйте это, чтобы получить положение метки именно так, как вы хотите:

let labelWidth = navBar.bounds.width - 110

    let label = UILabel(frame: CGRect(x:(navBar.bounds.width/2) - (labelWidth/2), y:0, width:labelWidth, height:navBar.bounds.height))
    label.backgroundColor = UIColor.clear
    label.numberOfLines = 0
    label.font = UIFont.boldSystemFont(ofSize: 13.0)
    label.textAlignment = .center
    label.textColor = UIColor.black
    label.lineBreakMode = .byWordWrapping

    label.text = loadedName
    navBar.topItem?.title = nil
    navBar.addSubview(label)

значение 110 в верхней строке — это интервал, который вы хотите с обеих сторон метки.

person ZiEiTiA    schedule 05.03.2017
comment
какие-нибудь намеки на то, как это сделать в swiftui? - person David Homes; 22.04.2021