繁体   English   中英

以编程方式快速添加约束

[英]add constraints programmatically 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])

}

然后,当我添加顶级约束的添加时,我遇到了运行时错误:

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

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

标签和Facebook按钮都在我的滚动视图中? 我什至已经打印出orLbl.superview和loginFBButton.superview,并且我都获得了可选的uiscrollview

有一种新的(iOS8,OS 10.10)激活约束的简便方法,它不需要弄清楚将视图添加到哪些视图。 约束已经知道它们属于哪些视图,因此首先请确保已将视图添加为子视图,然后在NSLayoutConstraint上调用类方法activateConstraints来激活它们:

 NSLayoutConstraint.activateConstraints([heightConstraint, topConstraint])

以编程方式创建UI元素时,需要告诉iOS不要将其框架变成约束。 为此,只需在创建loginFBButton执行以下操作:

对于Swift 1.2:

loginFBButton.setTranslatesAutoresizingMaskIntoConstraints(false)

对于Swift 2.0和3.0:

loginFBButton.translatesAutoresizingMaskIntoConstraints = false

最后,您将需要更多约束。 我建议为您的loginFBButton设置宽度约束,并添加一个约束以将按钮水平放置。

暂无
暂无

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

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