我已经查看了我能找到的所有类似问题,但我还没有找到解决这个问题的方法。
我在titleView
中设置viewDidLoad
属性:
self.navigationItem.titleView = label
视图控制器是导航堆栈的一部分。当您点击上一个视图控制器中的一行时,它会将此控制器推入堆栈。完全正常的UINavigationController东西。
当此视图控制器开始动画时,标签出现在原点(左上角),然后停留在那里直到视图控制器完成动画,然后它跳转(无动画)到导航中间的正确位置酒吧。
点击后退按钮后,标题视图会正确设置动画,就像普通标题一样。
以下是viewDidLoad
中的代码:
let label = UILabel(frame: CGRect.zero)
label.textAlignment = .center
label.translatesAutoresizingMaskIntoConstraints = false
label.backgroundColor = .red
label.text = "test"
label.sizeToFit()
self.navigationItem.titleView = label
我尝试的事情:
指定框架:无更改。另外,我不想指定一个框架。我不想对导航栏的高度做出假设。
将其移至viewWillAppear
:无变化。
将其移至viewDidAppear
:更好但仍然不对。在动画完成之前,标签根本不会出现,然后它出现在它应该的位置,它不会出现任何动画。正确的行为是像正常标题一样从右到左制作动画。
使用Xcode中的Master-Detail项目模板可以轻松重现这一点。如果您想尝试一下,只需将上面的代码添加到configureView()
中DetailViewController.swift
的顶部即可。在该模板中,导航项的标题被硬编码到故事板中。您可以通过搜索"详细信息"轻松删除它。单击显示Navigation Item: Title = "Detail"
的结果,然后从“检查器”窗格中删除该字符串。
更新
@ synndicate的建议确实适用于上面的UILabel
示例。但我真正的问题是UIStackView
。当我使用堆栈视图后,@ synndicate建议我得到另一个动画问题。这次标题视图开始滑动,但一直动画到原点。当动画结束时,它会捕捉到它应该的位置。
这里是prepare(for:sender:)
中的代码,因为@synndicate建议......
let label = UILabel(frame: CGRect.zero)
label.textAlignment = .center
label.translatesAutoresizingMaskIntoConstraints = false
label.backgroundColor = .red
label.text = "test"
let stackView = UIStackView(frame: CGRect.zero)
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.addArrangedSubview(label)
stackView.sizeToFit()
controller.navigationItem.titleView = stackView
还有什么建议吗?
此外,这是Xcode 8和iOS 10.
更新2
我发现上面的堆栈视图代码在viewDidLoad
中为导航层次结构的根是UINavigationController
的视图控制器完美地动画(就像普通标题一样)。导航层次结构的根目录为UISplitViewController
时会出现此问题。
所以我想我可以更新我的问题......
如何配置UIStackView
将在导航层次结构的根目录为navigationItem
的{{1}} titleView
属性中设置的UISplitViewController
?
答案 0 :(得分:0)
您是否可以在将视图控制器推入堆栈之前将代码移动到?
e.g。在Master-Detail项目的MasterViewController.swift
中
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
if let indexPath = tableView.indexPathForSelectedRow {
let object = objects[indexPath.row] as! NSDate
let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
controller.detailItem = object
controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
controller.navigationItem.leftItemsSupplementBackButton = true
let label = UILabel()
label.textAlignment = .center
label.backgroundColor = .red
label.text = "test"
label.sizeToFit()
controller.navigationItem.titleView = label
}
}
}
答案 1 :(得分:0)
如果您希望stackView出现在导航堆栈的特定视图控制器上,只需将其添加到视图控制器中
self.view.addSubview(stackView)