2014-11-03 104 views
16

我已经使用IB在视图控制器上添加了UIView。我们称之为redView以编程方式添加子视图并使用约束来定位它

enter image description here

然后我就在代码中使用自动布局约束固定的四面,当我运行它,它看起来像这样预期。

enter image description here

现在我想一个UILabel加入到这一观点编程,它位置使用自动布局约束的中心。

以下是我到目前为止的代码。

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet private var redView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     redView.setTranslatesAutoresizingMaskIntoConstraints(false) 

     let leadingConstraint = NSLayoutConstraint(item: redView, attribute: .Leading, relatedBy: .Equal, toItem: view, attribute: .Leading, multiplier: 1, constant: 0) 
     let trailingConstraint = NSLayoutConstraint(item: redView, attribute: .Trailing, relatedBy: .Equal, toItem: view, attribute: .Trailing, multiplier: 1, constant: 0) 
     let topConstraint = NSLayoutConstraint(item: redView, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1, constant: 0) 
     let bottomConstraint = NSLayoutConstraint(item: redView, attribute: .Bottom, relatedBy: .Equal, toItem: view, attribute: .Bottom, multiplier: 1, constant: 0) 
     view.addConstraints([leadingConstraint, trailingConstraint, topConstraint, bottomConstraint]) 


     let label = UILabel() 
     label.text = "Auto Layout Exercise" 
     redView.addSubview(label) 

     let xCenterConstraint = NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: redView, attribute: .CenterX, multiplier: 1, constant: 0) 
     let yCenterConstraint = NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: redView, attribute: .CenterY, multiplier: 1, constant: 0) 
     let leadingConstraint1 = NSLayoutConstraint(item: label, attribute: .Leading, relatedBy: .Equal, toItem: redView, attribute: .Leading, multiplier: 1, constant: 20) 
     let trailingConstraint1 = NSLayoutConstraint(item: label, attribute: .Trailing, relatedBy: .Equal, toItem: redView, attribute: .Trailing, multiplier: 1, constant: -20) 
     redView.addConstraints([xCenterConstraint, yCenterConstraint, leadingConstraint1, trailingConstraint1]) 

    } 

} 

问题是标签没有出现在redView上。任何人都可以告诉我我在这里失踪了什么?

谢谢。

回答

37

我敢肯定,你还需要设置:

label.setTranslatesAutoresizingMaskIntoConstraints(false) 

否则,我不认为限制将适用于标签。

+1

而事实上,你应该看到在控制台中该结果的信息。 – matt 2014-11-03 20:05:30

+0

并且在控制台中感谢天堂的那条消息,因为它几乎可以保证我每次都会忘记那行代码。 :) – matt 2014-11-03 20:08:53

+0

是的,这是原因。我曾经用'redView'的'setTranslatesAutoresizingMaskIntoConstraints'行进行了测试,但它没有影响视图,所以我认为这行不是必需的。我想这是你编程创建的视图。谢谢。 – Isuru 2014-11-03 20:08:56

11

注意事项斯威夫特2/3

它已经更改为布尔属性:UIView.translatesAutoresizingMaskIntoConstraints

相反,它以前是的:

label.setTranslatesAutoresizingMaskIntoConstraints(false) 

现在是:

label.translatesAutoresizingMaskIntoConstraints = false 
3

你需要做的这对每个UIControl分配NSConstraints

label.translatesAutoresizingMaskIntoConstraints = false 
相关问题