我是iOS开发人员的新手,我正在尝试开发一个如下所示的浏览器。
我在代码中设置了Bar View
的宽度和高度。它工作正常。
然后在Url Text Field
pin
的约束
宽度不限于父容器barView
(全宽)
我想知道文字字段的宽度有什么特别之处吗?我四处寻找,但没有找到答案。
答案 0 :(得分:1)
在UINavigationBar上设置UITextField,使用代码
下面的全宽度根据屏幕大小计算固定Rect的UITextField变量。你可以根据你的要求改变。
lazy var navTxtField:UITextField = UITextField(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 40))
在你的viewWillAppear
中 navTxtField.placeholder = "Search here..."
navTxtField.text = ""
self.navTxtField.addTarget(self, action: #selector(self.textDidChangeText(_:)), for: .editingChanged) // if you need to identify text changes in textfield measn you can use this otherwise ignore this
let leftNavBarButton = UIBarButtonItem(customView: navTxtField)
self.navigationItem.leftBarButtonItems?.append(leftNavBarButton)
希望这会对你有所帮助。
答案 1 :(得分:1)
UINavigationBar
没有正确地向我们公开Autolayout引擎
部分原因是它自iOS 11开始就支持Autolayout!
查看this gist by Yoshimasa Niwa了解更多信息:
UINavigationBar
在iOS 10之前一直使用手动布局,因此titleView
之类的所有内容视图都是UINavigationBar
的直接子视图。但是,从iOS 11开始,它使用带有大量布局指南的自动布局在其自己的内部容器视图_UINavigationBarContentView
中布置其内容视图。
通常,要将定位约束放在任何view
上,我们需要引用它superview
或兄弟视图。
someView.leadingAnchor.constraint(equalTo: superView.leadingAnchor)
someView.trailingAnchor.constraint(equalTo: superView.trailingAnchor)
同样,对于UINavigationBar
,我们需要引用titleView
的超级视图_UINavigationBarContentView
。
实际上,我们可以遍历self.navigationController?.navigationBar.subviews
以暂停_UINavigationBarContentView
以将一大堆锚点应用于titleView
,但由于_UINavigationBarContentView
是私有的,因此不应该完全引用。
谁知道层次结构在未来的iOS版本中是否会发生变化,或者他们可能会更改名称,或者他们不知道这些名称。
底线:我现在觉得在titleView
上没有安全的方法来应用正确的前导/尾随/上/下/等约束。*
*如果我错了,请纠正我
但是,如果您的urlTextField
是titleView
本身而不是barView
,例如:
你可以放心地逃脱:
urlTextField.translatesAutoresizingMaskIntoConstraints = false
urlTextField.widthAnchor.constraint(equalToConstant: self.view.frame.size.width - 16).isActive = true
urlTextField.layoutIfNeeded()
要看到这个: