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中创建自定义标题导航栏的正确方法是什么?
场景
创建所需的自定义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。
| 归档时间: |
|
| 查看次数: |
1284 次 |
| 最近记录: |