简体   繁体   English

添加UISearchController并以编程方式使用约束对其进行定位

[英]Adding a UISearchController and position it with constraints programmatically

I want to add a leading, trailing, bottom and width constraint programmatically to a UISearchController. 我想以编程方式将前导,尾随,底部和宽度约束添加到UISearchController。 This is my code: 这是我的代码:

@IBOutlet weak var navigationBar: UIView!

// create search bar
searchBar = UISearchController(searchResultsController: nil)
navigationBar.addSubview(searchBar.searchBar)
searchBar.searchBar.translatesAutoresizingMaskIntoConstraints = false

let leftConstraint = NSLayoutConstraint(item: searchBar.searchBar, attribute: .Leading, relatedBy: .Equal, toItem: navigationBar, attribute: .Leading, multiplier: 1, constant: 0)

let rightConstraint = NSLayoutConstraint(item: searchBar.searchBar, attribute: .Trailing, relatedBy: .Equal, toItem: navigationBar, attribute: .Trailing, multiplier: 1, constant: 0)

let bottomConstraint = NSLayoutConstraint(item: searchBar.searchBar, attribute: .Bottom, relatedBy: .Equal, toItem: navigationBar, attribute: .Bottom, multiplier: 1, constant: 0)

let heightConstraint = NSLayoutConstraint(item: searchBar.searchBar, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 44)

navigationBar.addConstraints([leftConstraint, rightConstraint, bottomConstraint, widthConstraint])

When running the app, the search bar appears correctly, but when I press on the search bar, it shrinks, and if I press another time the app crashes. 运行应用程序时,搜索栏会正确显示,但是当我按下搜索栏时,它会缩小,如果我按下另一次,应用程序崩溃了。 Here is the output: 这是输出:

2015-08-12 20:20:37.696 Contacts++[96997:8547485] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fb22580c7a0 UIView:0x7fb225817b20.leading == UIView:0x7fb223449860.leading>
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView(UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] to debug.
2015-08-12 20:20:37.697 Contacts++[96997:8547485] *** Assertion failure in -[UIView _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3491.2.5/NSLayoutConstraint_UIKitAdditions.m:590

Why do you need to create an instance of 'UISearchController' and get its searchBar? 为什么需要创建'UISearchController'的实例并获取其searchBar?

why not just make the searchBar from UISearchBar? 为什么不从UISearchBar创建searchBar?

// create a searchBar from UISearchBar
let searchBar = UISearchBar(frame: CGRectZero)

// add searchBar to navigationBar
navigationController?.navigationBar.addSubview(searchBar)

// call sizeToFit.. this will set the frame of the searchBar to exactly the same as the size of the allowable frame of the navigationBar
searchBar.sizeToFit()

// now reframe the searchBar to add some margins
var frame = searchBar.frame
frame.origin.x = 20
frame.size.width -= 40
searchBar.frame = frame // set new frame with margins

note: you won't need any of those constraint to achieve this. 注意:您不需要任何这些约束来实现此目的。

But if you really prefer the constraint, here's the constraint code without a crash. 但是如果你真的更喜欢约束,这里是没有崩溃的约束代码。

let searchBar = UISearchBar(frame: CGRectZero)
navigationController?.navigationBar.addSubview(searchBar)
searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)

let leftConstraint = NSLayoutConstraint(item: searchBar, attribute: .Leading, relatedBy: .Equal, toItem: navigationController?.navigationBar, attribute: .Leading, multiplier: 1, constant: 20) // add margin

let bottomConstraint = NSLayoutConstraint(item: searchBar, attribute: .Bottom, relatedBy: .Equal, toItem: navigationController?.navigationBar, attribute: .Bottom, multiplier: 1, constant: 1)

let topConstraint = NSLayoutConstraint(item: searchBar, attribute: .Top, relatedBy: .Equal, toItem: navigationController?.navigationBar, attribute: .Top, multiplier: 1, constant: 1)

let widthConstraint = NSLayoutConstraint(item: searchBar, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.view.frame.size.width - 40) // - margins from both sides

navigationController?.navigationBar.addConstraints([leftConstraint, bottomConstraint, topConstraint, widthConstraint])

Do you really want to set the width of the navigatinBar to 44 points? 你真的将navigatinBar的宽度设置为44分吗? Width is horizontal. 宽度是水平的。 You already have a width constraint by adding trailing and leading constraints. 通过添加尾随和前导约束,您已经有了宽度约束。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM