如何以编程方式添加实际适合屏幕的导航栏?
How can I add a navigation bar programmatically that actually fits the screen?
我正在使用 Eureka forms。我的自定义选择器行之一以 formSheet
.
的样式模态显示另一个 VC (EditorVC
)
我可以通过呈现 UINavigationController
并将 EditorVC
作为根 VC 来做到这一点。但是,这将需要我在 UINavigationController
和 EditorVC
之间传递数据(即 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
以某种方式做到了。
你只需要将 translatesAutoresizingMaskIntoConstraints 设置为 false 就可以了。您需要它,因为您自己向视图添加了约束。如果你不这样做,那么当 phone 改变方向( viewWillTransition()... )时你必须自己处理导航栏宽度。
此外,如果将其设置为 true 并且您添加了自己的约束,您可能会遇到一些冲突。
所以,这样做:
let myNav = UINavigationBar(frame: CGRect.zero)
myNav.translatesAutoresizingMaskIntoConstraints = false
您也不需要设置导航栏的宽度,因为您使用了约束。您只需设置它 CGRect.zero
您可以阅读有关 translatesAutoresizingMaskIntoConstraints 的更多信息here
我正在使用 Eureka forms。我的自定义选择器行之一以 formSheet
.
EditorVC
)
我可以通过呈现 UINavigationController
并将 EditorVC
作为根 VC 来做到这一点。但是,这将需要我在 UINavigationController
和 EditorVC
之间传递数据(即 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
以某种方式做到了。
你只需要将 translatesAutoresizingMaskIntoConstraints 设置为 false 就可以了。您需要它,因为您自己向视图添加了约束。如果你不这样做,那么当 phone 改变方向( viewWillTransition()... )时你必须自己处理导航栏宽度。
此外,如果将其设置为 true 并且您添加了自己的约束,您可能会遇到一些冲突。
所以,这样做:
let myNav = UINavigationBar(frame: CGRect.zero)
myNav.translatesAutoresizingMaskIntoConstraints = false
您也不需要设置导航栏的宽度,因为您使用了约束。您只需设置它 CGRect.zero
您可以阅读有关 translatesAutoresizingMaskIntoConstraints 的更多信息here