以编程方式快速添加约束

use*_*025 13 constraints ios nslayoutconstraint swift

我正在尝试为facebook sdk登录按钮添加约束.

我在滚动视图中有按钮,我正在尝试将顶部约束添加到也在滚动视图中的标签.我能够成功添加高度约束,没有运行时错误,但实际约束似乎没有应用于按钮.

@IBOutlet weak var orLbl: UILabel!
@IBOutlet weak var scrollView: UIScrollView!

override func viewDidLoad() {
    super.viewDidLoad()
    var loginFBButton = FBSDKLoginButton()
    loginFBButton.readPermissions = ["public_profile", "email"]

    let heightConstraint = NSLayoutConstraint(
        item: loginFBButton,
        attribute: NSLayoutAttribute.Height,
        relatedBy: NSLayoutRelation.Equal,
        toItem: nil,
        attribute: NSLayoutAttribute.NotAnAttribute,
        multiplier: 1,
        constant: 41)
    let topConstraint = NSLayoutConstraint(
        item: loginFBButton,
        attribute: NSLayoutAttribute.TopMargin,
        relatedBy: NSLayoutRelation.Equal,
        toItem: self.orLbl,
        attribute: NSLayoutAttribute.BottomMargin,
        multiplier: 1,
        constant: 31)
    let leadingConstraint = NSLayoutConstraint(
        item: loginFBButton,
        attribute: NSLayoutAttribute.Leading,
        relatedBy: NSLayoutRelation.Equal,
        toItem: self.registerButton,
        attribute: NSLayoutAttribute.Left,
        multiplier: 1,
        constant: 0)
    let trailingConstraint = NSLayoutConstraint(
        item: loginFBButton,
        attribute: NSLayoutAttribute.Leading,
        relatedBy: NSLayoutRelation.Equal,
        toItem: self.registerButton,
        attribute: NSLayoutAttribute.Right,
        multiplier: 1,
        constant: 0)

    self.scrollView.addSubview(loginFBButton)
    //loginFBButton.center = self.scrollView.center

    loginFBButton.addConstraints([heightConstraint, topConstraint])

}
Run Code Online (Sandbox Code Playgroud)

然后,当我添加顶部约束时,我收到运行时错误:

添加到视图时,约束的项必须是该视图(或视图本身)的后代.如果在组装视图层次结构之前需要解析约束,则会崩溃.

由于未捕获的异常'NSGenericException'而终止应用程序,原因:'无法在视图上安装约束.约束是否引用了视图子树之外的内容?那是违法的.

标签和facebook按钮都在我的滚动视图中?我甚至打印出了orLbl.superview和loginFBButton.superview,我得到了两个可选的uiscrollview

vac*_*ama 29

有一个新的(iOS8,OS 10.10),更简单的方法来激活约束,不涉及找出添加它们的视图.约束已经知道自己属于哪个意见来,所以首先要确保你的观点已经被添加为子视图,然后调用类的方法activateConstraintsNSLayoutConstraint激活它们:

 NSLayoutConstraint.activateConstraints([heightConstraint, topConstraint])
Run Code Online (Sandbox Code Playgroud)

以编程方式创建UI元素时,需要告诉iOS不要将其框架变为约束.要做到这一点,就在创建之后loginFBButton:

对于Swift 1.2:

loginFBButton.setTranslatesAutoresizingMaskIntoConstraints(false)
Run Code Online (Sandbox Code Playgroud)

对于Swift 2.0和3.0:

loginFBButton.translatesAutoresizingMaskIntoConstraints = false
Run Code Online (Sandbox Code Playgroud)

最后,您将需要更多约束.我建议为您设置宽度约束loginFBButton并添加约束以水平定位按钮.