如何以编程方式添加实际适合屏幕的导航栏?

时间:2017-05-23 06:11:26

标签: ios swift eureka-forms

我正在使用Eureka forms。我的一个自定义选择器行以EditorVC的方式模式呈现另一个VC(formSheet)。

我可以通过提供UINavigationController并将EditorVC作为根VC来实现此目的。但是,这需要我在EditorVCUINavigationController之间传递数据(即EditorVC中某些内容发生变化时的行值)。这对我来说太麻烦了。

这就是我采用编程方式创建导航栏的原因。

我搜索了SO,这是我的第一次尝试:

myNav = UINavigationBar(frame: CGRect(x: 0, y: 0, width: self.view.width, height: 44))
myNav.barTintColor = #colorLiteral(red: 0.3529411765, green: 0.7333333333, blue: 0.3529411765, alpha: 1)
myNav.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
self.view.addSubview(myNav)
let cancelItem: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancel))
cancelItem.tintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
let doneItem: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(done))
doneItem.tintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
let navigItem: UINavigationItem = UINavigationItem(title: "Title")
navigItem.rightBarButtonItem = doneItem
navigItem.leftBarButtonItem = cancelItem
myNav.items = [navigItem]

当我在iPhone上运行应用程序时,导航栏会按预期显示,但如果我更改屏幕方向,导航栏会保持其宽度,因此不会覆盖屏幕的整个宽度。在iPad上,导航栏太宽。它超出了表单的宽度,因此无法看到右侧的条形按钮项。标题也没有居中。

所以我尝试将布局约束添加到导航栏:

let top = NSLayoutConstraint(item: myNav, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1, constant: 0)
let leading = NSLayoutConstraint(item: myNav, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1, constant: 0)
let trailing = NSLayoutConstraint(item: myNav, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1, constant: 0)
view.addConstraints([top, leading, trailing])

但显然它并没有改变任何东西。当我运行应用程序时,会发生同样的事情。

如何创建始终适合屏幕宽度的导航栏?这一定是可能的,对吧?因为UINavigationController以某种方式做到了。

1 个答案:

答案 0 :(得分:1)

你只需要将translatesAutoresizingMaskIntoConstraints设置为false,一切都会好的。您需要这个,因为您自己为视图添加了约束。如果你不这样做,那么当手机改变方向时你必须自己处理导航栏宽度(viewWillTransition()...)。

此外,如果将此设置为true并添加自己的约束,则可能会出现一些冲突。

所以,这样做:

let myNav = UINavigationBar(frame: CGRect.zero)
myNav.translatesAutoresizingMaskIntoConstraints = false

您也不需要设置导航栏的宽度,因为您使用了约束。你只需将它设置为CGRect.zero

您可以阅读有关translatesAutoresizingMaskIntoConstraints here

的更多信息