UIView内部约束

时间:2019-02-26 12:17:15

标签: ios swift uiview constraints

我创建了一个简单的UIView,其中心包含一个红色框(UIImage)。当所有约束都是常量时,代码可以正常工作。但是,如果我将高度约束替换为使框成为视图高度一半的约束,那么该框就会消失。

我认为这是因为(显然)我做错了,还是我需要做更多的事情来强制约束以使UIView高度大于零。

如何设置redBox高度限制,使其始终为BoxView高度的一半?

00:03:10

1 个答案:

答案 0 :(得分:1)

替换

redBox.heightAnchor.constraint(equalTo: self.heightAnchor, constant: 0.5)

使用

redBox.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.5).isActive = true

NSLayoutConstraint.activate([
    redBox.centerXAnchor.constraint(equalTo: self.centerXAnchor),
    redBox.centerYAnchor.constraint(equalTo: self.centerYAnchor),
    redBox.widthAnchor.constraint(equalToConstant: 100),
    redBox.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.5)
])

在当前代码中,您首先会错过.isActive = true,其效果与该行不存在相同,并且,如果指定该选项,则框的高度将等于视图的高度+常数(= 0.5)

  

框高=视图高度*乘数+常数

并且由于默认乘数= 1且您将常数设置为0.5,因此它将为

  

盒子高度=视图高度* 1.0 + 0.5

但是您需要

  

box height =视图高度* 0.5 + 0 //省略约束中的约束,它将为零


class BoxView: UIView { 
    public var redBox: UIImageView
    public override init(frame: CGRect) {
        super.init(frame: frame)
        redBox = UIImageView(frame: .zero)
        redBox.backgroundColor = .red
        self.backgroundColor = .yellow
        addSubview(redBox)
        redBox.translatesAutoresizingMaskIntoConstraints = false
        let margins = layoutMarginsGuide

        NSLayoutConstraint.activate([
            redBox.centerXAnchor.constraint(equalTo: self.centerXAnchor),
            redBox.centerYAnchor.constraint(equalTo: self.centerYAnchor),
            redBox.widthAnchor.constraint(equalToConstant: 100),
            redBox.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.5)
        ])
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}