水平自动布局约束

时间:2015-12-18 22:28:05

标签: ios swift autolayout

在UITableViewCell的子类中,我正在尝试使用自动布局。

这是我想要做的: layout

以下是我的代码不起作用:只显示一个视图

import Foundation

class CustomCell: UITableViewCell {

    func configureCell() {

        backgroundColor = UIColor.yellowColor()

        let redColorView = UIView()
        redColorView.backgroundColor = UIColor.redColor()
        redColorView.translatesAutoresizingMaskIntoConstraints = false

        let blueColorView = UIView()
        blueColorView.backgroundColor = UIColor.blueColor()
        blueColorView.translatesAutoresizingMaskIntoConstraints = false

        addSubview(blueColorView)
        addSubview(redColorView)

        let viewsDictionary = ["blue":blueColorView,"red":redColorView]

        let layout = NSLayoutFormatOptions(rawValue: 0)

        let horizontalContraint:[NSLayoutConstraint] = NSLayoutConstraint.constraintsWithVisualFormat("|-10-[blue]-10-[red]-10-|", options: layout, metrics: nil, views: viewsDictionary)

        let verticalContraint_1:[NSLayoutConstraint] = NSLayoutConstraint.constraintsWithVisualFormat("V:|-10-[blue]-10-|", options: layout, metrics: nil, views: viewsDictionary)

        let verticalContraint_2:[NSLayoutConstraint] = NSLayoutConstraint.constraintsWithVisualFormat("V:|-10-[red]-10-|", options: layout, metrics: nil, views: viewsDictionary)

        self.addConstraints(verticalContraint_1)
        self.addConstraints(verticalContraint_2)
        self.addConstraints(horizontalContraint)
    }
}

1 个答案:

答案 0 :(得分:2)

问题是你的水平约束是模糊的。它们不足以解决一个布局问题。因此,系统必须从各种可能性中任意选择。

特别是,|-10-[blue]-10-[red]-10-|未指定bluered的宽度。假设超级视图超过30个点,则可以使用任何数量的解决方案。 blue可以是0宽度,red可以是superview的宽度减去30.反之亦然。或者介于两者之间。对两个子视图宽度的唯一有效约束是它们加起来超级视图的宽度减去30.因为你说只有一个是可见的,大概是另一个被分配了0宽度。

正如您所注意到的,您可以明确约束其中一个子视图的宽度,或者您可以指定它们彼此具有相等的宽度(或其他比例)。

如果视图具有内在大小,或者如果它们具有内在大小的子视图并且它们的宽度基于其子视图受到约束,那么诸如内容拥抱和抗压缩优先级之类的内容将会发挥作用。但是你所使用的普通UIView没有内在的大小,所以他们没有。