iOS 12中的自定义导航标题

Seb*_*lan 2 xcode uinavigationbar uinavigationcontroller ios swift

我正在尝试在iOS应用上实现自定义导航标题。

故事板如下所示:

在此处输入图片说明

我想要自定义导航标题的位置是最后一个视图(消息视图),并且由于我使用图像和文本,因此这意味着我需要自定义宽度和高度。如果需要,我需要这样做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
Run Code Online (Sandbox Code Playgroud)

标题的高度被限制为44pt。

但是我设法做到的是将subViews添加到导航栏中:

var navigationBar: MessagesNavigationBar? {
    guard let navigationBar = navigationController?.navigationBar as? MessagesNavigationBar else {
        return nil
    }
    return navigationBar
}
Run Code Online (Sandbox Code Playgroud)

而在 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!)
Run Code Online (Sandbox Code Playgroud)

但是问题是离开视图时必须删除子视图,否则添加的任何内容也将出现在表视图中。

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

这让我感到自己做的不对,当我离开对话时,很难为那些子视图添加淡入淡出的动画。(即iOS上的本机消息应用程序)。

那么在iOS 12中创建自定义标题导航栏的正确方法是什么?

场景

在此处输入图片说明

ole*_*jak 5

创建所需的自定义titleView并将其分配给navigationItem.titleView您。在旧系统(PRE iOS的11),你就可能需要调用sizeToFit()titleView

这样您可以创建此titleView

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
}
Run Code Online (Sandbox Code Playgroud)

标题视图

您可能还需要正确设置一组自动布局约束或使用UIStackView