簡體   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