Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 添加UISearchController并以编程方式使用约束定位它_Ios_Swift_Autolayout_Uisearchcontroller - Fatal编程技术网

Ios 添加UISearchController并以编程方式使用约束定位它

Ios 添加UISearchController并以编程方式使用约束定位它,ios,swift,autolayout,uisearchcontroller,Ios,Swift,Autolayout,Uisearchcontroller,我想以编程方式向UISearchController添加前导、尾随、底部和宽度约束。这是我的代码: @IBOutlet weak var navigationBar: UIView! // create search bar searchBar = UISearchController(searchResultsController: nil) navigationBar.addSubview(searchBar.searchBar) searchBar.searchBar.translate

我想以编程方式向UISearchController添加前导、尾随、底部和宽度约束。这是我的代码:

@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])
运行应用程序时,搜索栏会正确显示,但当我按下搜索栏时,搜索栏会收缩,如果我再次按下,应用程序会崩溃。以下是输出:

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
2015-08-12 20:20:37.696 Contacts++[96997:8547485]视图层次结构未为约束做好准备:
添加到视图时,约束项必须是该视图(或视图本身)的后代。如果在装配视图层次之前需要解决约束,则此操作将崩溃。中断-[UIView(UIConstraintBasedLayout)\u viewHierarchyUnpreparedForConstraint:]以进行调试。
2015-08-12 20:20:37.697 Contacts++[96997:8547485]***断言失败-[UIView\u layoutEngine\u didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:],/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit\u Sim/UIKit-3491.2.5/NSLayoutConstraint\u UIKitAdditions.m:590

您真的想将导航栏的宽度设置为44点吗?宽度是水平的。通过添加尾随和前导约束,您已经有了宽度约束。

为什么需要创建“UISearchController”的实例并获取其搜索栏

为什么不直接从UISearchBar创建搜索栏呢

// 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
注意:您不需要任何这些约束来实现这一点

但是如果您真的喜欢约束,下面是没有崩溃的约束代码

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])

将您称为searchController“searchBar”有点奇怪。您真的想将NavigateInBar的宽度设置为44点吗?我已经编辑了这个问题,并说明了现在到底发生了什么。如果您部署到iOS8或更高版本,请尝试将
navigationBar.addConstraints(
替换为
NSLayoutConstraint.activateConstraints(
。同样的问题也发生了。我很惭愧,是的,它应该是高度。但我仍然得到了同样的效果,当按inside search时搜索会缩小,然后如果我再次单击,它就会崩溃。这是当TranslatesAutoReshizingMaskintoConstraints=false时。如果我将其设置为true,它将正确工作,但没有正确对齐。我与在底部和搜索栏。你知道如何解决这个问题吗?嗨,它工作得很好,但当我触摸它时,我的搜索栏消失了。你知道吗?@GreenToxinoNetV这可能与iOS11更新有关,它完全改变了导航栏的行为。