iOS 12中的自定义导航标题

时间:2018-11-20 22:02:21

标签: ios swift xcode uinavigationcontroller uinavigationbar

我正在尝试在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。

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

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 :(得分:2)

这些行对标题视图的大小没有影响:

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

相反(或另外)为标题视图提供宽度限制和高度限制。这就是运行时知道所需大小的方式。

答案 1 :(得分:1)

创建自定义titleView并将其分配给navigationItem.titleView是您想要的。在较旧的系统(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
}

title view

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