以编程方式向UIView添加约束

时间:2017-08-22 07:48:01

标签: ios swift uiview nslayoutconstraint

我想在视图中添加一个较小的子视图并为其添加约束。领先和训练约束应为50.0,高度和底部应为80.0。

我以这种方式创建我的子视图

let mySubview = UIView(frame: CGRect(x: 50.0, y: 80.0, width: 540.0, height: 220.0))

然后我尝试使用此代码

将其添加到视图中
let topConstraint = NSLayoutConstraint(item: mySubview, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1, constant: 80.0)
let bottomConstraint = NSLayoutConstraint(item: mySubview, attribute: .bottom, relatedBy: .equal, toItem: self.view, attribute: .bottom, multiplier: 1, constant: 80.0)
let leadingConstraint = NSLayoutConstraint(item: mySubview, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1, constant: 50.0)
let trailingConstraint = NSLayoutConstraint(item: mySubview, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1, constant: 50.0)

mySubview.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(mySubview)
self.view.addConstraints([topConstraint, bottomConstraint, leadingConstraint, trailingConstraint])
self.view.layoutIfNeeded()

但是这些约束没有任何效果。这个视图在iPad上看起来不错,可能是因为第一个初始化CGRect(x: 50.0, y: 80.0, width: 540.0, height: 220.0),但在较小的屏幕上看起来非常大。我应该尝试根据屏幕初始化UIView,还是可以通过添加约束来解决这个问题?

5 个答案:

答案 0 :(得分:2)

你需要这个:

mySubview.translatesAutoresizingMaskIntoConstraints = false
  

translatesAutoresizingMaskIntoConstraints 是一个布尔值   确定是否将视图的自动调整遮罩转换为   自动布局约束。

答案 1 :(得分:2)

你应该尝试使用http://snapkit.io/docs/

let box = UIView()
superview.addSubview(box)

box.snp.makeConstraints { (make) -> Void in
    make.top.equalTo(superview).offset(80)
    make.left.equalTo(superview).offset(50)
    make.bottom.equalTo(superview).offset(-80)
    make.right.equalTo(superview).offset(-50)
}

答案 2 :(得分:1)

由于您想要使用自动布局,因此在没有帧的情况下实例化子视图就足够了(因为考虑到约束会计算帧):let mySubview = UIView()

然后,您必须为您的子视图设置translatesAutoresizingMaskIntoConstraintsfalse

您还必须将底部约束的常量更改为 -80 ,将尾部约束的常量更改为 -50 。如果你想保持正常数,你也可以切换项目(self.view / mySubview):

let bottomConstraint = NSLayoutConstraint(item: self.view, attribute: .bottom, relatedBy: .equal, toItem: mySubview, attribute: .bottom, multiplier: 1, constant: 80.0)
let trailingConstraint = NSLayoutConstraint(item: self.view, attribute: .trailing, relatedBy: .equal, toItem: mySubview, attribute: .trailing, multiplier: 1, constant: 50.0)

最后但并非最不重要的是,您可以删除self.view.layoutIfNeeded()行。

答案 3 :(得分:0)

您忘记将translatesAutoresizingMaskIntoConstraints设置为false

let mySubview = UIView(frame: CGRect(x: 50.0, y: 80.0, width: 540.0, height: 220.0))

mySubview.translatesAutoresizingMaskIntoConstraints = false

答案 4 :(得分:0)

我认为这可以解决问题

mySubview.translatesAutoresizingMaskIntoConstraints = false

喜欢这个

let mySubview: UIView = {
    let thisView = UIView(frame: CGRect(x: 50.0, y: 80.0, width: 540.0, height: 220.0))
    thisView.translatesAutoresizingMaskIntoConstraints = false
    return thisView
}()