IBOutlets 的约束冲突
IBOutlets' constraints conflict
当我尝试手动设置 IBOutlet
的约束时,我遇到了 NSLayoutConstraint
冲突。本质上,我只是将视图放在故事板中以大致了解它们的外观,然后创建 IBOutlet
s 来引用它们。但是在代码中添加了所有约束:
class LoginViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var view1: UIView!
@IBOutlet weak var view2: UView2!
@IBOutlet weak var name: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
view2.addSubview(name)
//add constraints
NSLayoutConstraint(item: view1, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0).active = true
NSLayoutConstraint(item: view1, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1, constant: -self.view.frame.height * 0.07).active = true
NSLayoutConstraint(item: view1, attribute: .Width, relatedBy: .Equal, toItem: self.view, attribute: .Width, multiplier: 0.8, constant: 0).active = true
NSLayoutConstraint(item: view1, attribute: .Height, relatedBy: .Equal, toItem: self.view, attribute: .Height, multiplier: 0.4, constant: 0).active = true
NSLayoutConstraint(item: view2, attribute: .Width, relatedBy: .Equal, toItem: view1, attribute: .Width, multiplier: 1, constant: 0).active = true
NSLayoutConstraint(item: view2, attribute: .CenterX, relatedBy: .Equal, toItem: view1, attribute: .CenterX, multiplier: 1, constant: 0).active = true
NSLayoutConstraint(item: view2, attribute: .Top, relatedBy: .Equal, toItem: view1, attribute: .Bottom, multiplier: 1, constant: self.view.frame.height * 0.01).active = true
NSLayoutConstraint(item: view2, attribute: .Height, relatedBy: .Equal, toItem: self.view, attribute: .Height, multiplier: 0.1, constant: 0).active = true
}
}
当我在代码中创建视图时,NSLayoutConstraint
冲突消失了,即 var view2 = UIView()
或者如果我注释掉 view2
的约束。没看懂。
编辑:根据日志,问题似乎是 NSIBPrototypingLayoutConstraint
和 UIView-Encapsulated-Layout-Height'
对于 view2
尽管情节提要中没有设置自动布局约束。现在让我困惑的是为什么 view1
没有这个问题,因为它们都被添加到故事板中了?
你还没有在storyboard中给view2
设置约束,所以Xcode偷偷给你加了约束。您需要做的是在情节提要中为 view2
添加约束,并且(因为您在运行时并不真正需要它们)告诉 Xcode 在构建时删除这些约束:
当我尝试手动设置 IBOutlet
的约束时,我遇到了 NSLayoutConstraint
冲突。本质上,我只是将视图放在故事板中以大致了解它们的外观,然后创建 IBOutlet
s 来引用它们。但是在代码中添加了所有约束:
class LoginViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var view1: UIView!
@IBOutlet weak var view2: UView2!
@IBOutlet weak var name: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
view2.addSubview(name)
//add constraints
NSLayoutConstraint(item: view1, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0).active = true
NSLayoutConstraint(item: view1, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1, constant: -self.view.frame.height * 0.07).active = true
NSLayoutConstraint(item: view1, attribute: .Width, relatedBy: .Equal, toItem: self.view, attribute: .Width, multiplier: 0.8, constant: 0).active = true
NSLayoutConstraint(item: view1, attribute: .Height, relatedBy: .Equal, toItem: self.view, attribute: .Height, multiplier: 0.4, constant: 0).active = true
NSLayoutConstraint(item: view2, attribute: .Width, relatedBy: .Equal, toItem: view1, attribute: .Width, multiplier: 1, constant: 0).active = true
NSLayoutConstraint(item: view2, attribute: .CenterX, relatedBy: .Equal, toItem: view1, attribute: .CenterX, multiplier: 1, constant: 0).active = true
NSLayoutConstraint(item: view2, attribute: .Top, relatedBy: .Equal, toItem: view1, attribute: .Bottom, multiplier: 1, constant: self.view.frame.height * 0.01).active = true
NSLayoutConstraint(item: view2, attribute: .Height, relatedBy: .Equal, toItem: self.view, attribute: .Height, multiplier: 0.1, constant: 0).active = true
}
}
当我在代码中创建视图时,NSLayoutConstraint
冲突消失了,即 var view2 = UIView()
或者如果我注释掉 view2
的约束。没看懂。
编辑:根据日志,问题似乎是 NSIBPrototypingLayoutConstraint
和 UIView-Encapsulated-Layout-Height'
对于 view2
尽管情节提要中没有设置自动布局约束。现在让我困惑的是为什么 view1
没有这个问题,因为它们都被添加到故事板中了?
你还没有在storyboard中给view2
设置约束,所以Xcode偷偷给你加了约束。您需要做的是在情节提要中为 view2
添加约束,并且(因为您在运行时并不真正需要它们)告诉 Xcode 在构建时删除这些约束: