我正在使用Eureka forms。我的一个自定义选择器行以EditorVC
的方式模式呈现另一个VC(formSheet
)。
我可以通过提供UINavigationController
并将EditorVC
作为根VC来实现此目的。但是,这需要我在EditorVC
和UINavigationController
之间传递数据(即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
以某种方式做到了。
答案 0 :(得分:1)
你只需要将translatesAutoresizingMaskIntoConstraints设置为false,一切都会好的。您需要这个,因为您自己为视图添加了约束。如果你不这样做,那么当手机改变方向时你必须自己处理导航栏宽度(viewWillTransition()...)。
此外,如果将此设置为true并添加自己的约束,则可能会出现一些冲突。
所以,这样做:
let myNav = UINavigationBar(frame: CGRect.zero)
myNav.translatesAutoresizingMaskIntoConstraints = false
您也不需要设置导航栏的宽度,因为您使用了约束。你只需将它设置为CGRect.zero
您可以阅读有关translatesAutoresizingMaskIntoConstraints here
的更多信息