如何在导航栏中设置父视图的文本字段全宽

时间:2018-05-30 03:06:21

标签: ios uinavigationcontroller uitextfield constraints

我是iOS开发人员的新手,我正在尝试开发一个如下所示的浏览器。

enter image description here

我在代码中设置了Bar View的宽度和高度。它工作正常。

enter image description here

然后在Url Text Field

中添加pin的约束

enter image description here

宽度不限于父容器barView(全宽)

enter image description here

我想知道文字字段的宽度有什么特别之处吗?我四处寻找,但没有找到答案。

2 个答案:

答案 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上没有安全的方法来应用正确的前导/尾随/上/下/等约束。*
*如果我错了,请纠正我

建议:

但是,如果您的urlTextFieldtitleView本身而不是barView,例如:

TextField as TitleView

你可以放心地逃脱:

urlTextField.translatesAutoresizingMaskIntoConstraints = false
urlTextField.widthAnchor.constraint(equalToConstant: self.view.frame.size.width - 16).isActive = true
urlTextField.layoutIfNeeded()

要看到这个:

Simulator Output