Пользовательский заголовок навигации в iOS 12 - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь реализовать пользовательский заголовок навигации в приложении для iOS.

StoryBoard выглядит следующим образом:

enter image description here

Место, где я хочу иметь пользовательский заголовок навигации, - это последний вид (вид сообщения), и поскольку я использую изображение и текст, это означает, что мне нужно иметь пользовательские ширину и высоту.Это необходимо, если я сделаю это в viewDidLoad:

let rect = CGRect(x: 0, y:0, width: 150, height: 88)
titleView = UIView(frame: rect)
......
titleView?.addSubview(imageView)
......
titleView?.addSubview(label)
navigationItem.titleView = titleView

Высота заголовка заблокирована до 44pt.

Но как мне удалось это сделать, это добавить подпункты к навигацииbar:

var navigationBar: MessagesNavigationBar? {
    guard let navigationBar = navigationController?.navigationBar as? MessagesNavigationBar else {
        return nil
    }
    return navigationBar
}

И в viewDidLoad

let rect = CGRect(x: 0, y:0, width: 150, height: 88)
titleView = UIView(frame: rect)
......
titleView?.addSubview(imageView)
......
titleView?.addSubview(label)
navigationBar?.addSubview(titleView!)

Но проблема в том, что мне нужно удалить подпредставления, когда я покидаю представление, иначе все, что я добавлю, будет присутствоватьа также в табличном представлении.

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    if navigationBar != nil {
        titleView?.removeFromSuperview()
    }
}

Что заставляет меня чувствовать, что я поступаю неправильно, и мне трудно добавить анимацию затухания в эти подпредставления, когда я покидаю разговор.(т.е. приложение для родных сообщений на iOS).

Итак, как правильно создать собственную панель навигации заголовка в iOS 12?

Сцены

enter image description here

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Эти строки не влияют на размер представления заголовка:

let rect = CGRect(x: 0, y:0, width: 150, height: 88)
titleView = UIView(frame: rect)

Вместо этого (или дополнительно) задайте для представления заголовка ограничение ширины и ограничение высоты.Вот как среда выполнения знает, какой размер вы хотите.

0 голосов
/ 21 ноября 2018

Создание вашего пользовательского titleView и присвоение его navigationItem.titleView - это то, что вы хотите.В старых системах (до iOS 11) вам может потребоваться вызвать sizeToFit() на titleView.

. Таким образом, вы можете создать этот заголовок View

override func viewDidLoad() {
    super.viewDidLoad()


    let imageView = UIImageView()
    NSLayoutConstraint.activate([
        imageView.heightAnchor.constraint(equalToConstant: 20),
        imageView.widthAnchor.constraint(equalToConstant: 20)
    ])
    imageView.backgroundColor = .red

    let titleLabel = UILabel()
    titleLabel.text = "Custom title"

    let hStack = UIStackView(arrangedSubviews: [imageView, titleLabel])
    hStack.spacing = 5
    hStack.alignment = .center

    navigationItem.titleView = hStack
}

title view

Возможно, вам также понадобится правильный набор ограничений для автоматического размещения или используйте UIStackView.

...