NSAutolayoutConstraint - 在乘数

时间:2017-06-05 18:40:57

标签: ios swift nslayoutconstraint

今天multiplier属性是只读的。要更改它,您必须删除约束并创建一个新约束。

let newConstraint = NSLayoutConstraint(
    item: constraint.firstItem,
    attribute: constraint.firstAttribute,
    relatedBy: constraint.relation,
    toItem: constraint.secondItem,
    attribute: constraint.secondAttribute,
    multiplier: newMultiplier,
    constant: constraint.constant
)

在此示例中,首先应用乘数,然后应用常量。例如:

想象一下,它是超级视图的宽度约束。

这意味着我们将view.width = superview.width * multiplier - 2。 (这也意味着multiplier = 0将会中断。)

我需要的是view.width = (superview.width - 2) * multiplier。我如何创建这样的约束?

我也不想做类似的事情:

let newConstraint = NSLayoutConstraint(
    item: constraint.firstItem,
    attribute: constraint.firstAttribute,
    relatedBy: constraint.relation,
    toItem: constraint.secondItem,
    attribute: constraint.secondAttribute,
    multiplier: newMultiplier,
    constant: constant * newMultiplier
)

因为我最终失去了来自故事板的constraint.constant

4 个答案:

答案 0 :(得分:1)

为什么要更改乘数值?改为改变常数值..

在类

中声明
var yourViewWidthConstraint: NSLayoutConstraint?

实例化此约束

yourViewWidthConstraint = yourView.widthAnchor.constraint(self.view.widthAnchor)
yourViewWidthConstraint?.isActive = true

现在,在任何地方更改yourViewWidthConstraint.constant ..

答案 1 :(得分:0)

让我们说你的superView是主屏幕。

newConstraint.constant = (UIScreen.mainScreen().bounds.size.width - 2) * your_multiplier

答案 2 :(得分:0)

您可以尝试下一步:

class MyConstraint: NSLayoutConstraint {

    fileprivate var storyboardConstant: CGFloat!

    override func awakeFromNib() {
        super.awakeFromNib()
        storyboardConstant = constant
    }

    func copy(with newMultiplier: CGFloat) -> MyConstraint? {
        guard let viewWidth = constraint.secondItem?.bounds?.width,
              let _ = storyboardConstant else {
            return nil
        }
        let newConstraint = MyConstraint(
            item: constraint.firstItem,
            attribute: constraint.firstAttribute,
            relatedBy: constraint.relation,
            toItem: constraint.secondItem,
            attribute: constraint.secondAttribute,
            multiplier: newMultiplier,
            constant: storyboardConstant * newMultiplier
        )
        return newConstraint
    }
}

答案 3 :(得分:0)

在这些图像中,紫色是" SuperView" ...橙色是" OuterView" ...蓝色是" InnerView"

对于您的使用,紫色和橙色可能具有.clear背景色。

" SuperView"的宽度约束控制其两个子视图的宽度 - 在此示例中,橙色将是紫色宽度的-2,蓝色将是橙色宽度的90%(0.9倍数)。

"的SuperView"只需设置为宽度和高度,并在其父视图中居中。

enter image description here

" OuterView"将等宽度设置为其超级视图(紫色/" SuperView"),常量为-2(无乘数)

enter image description here

" InnerView"将等宽度设置为超级视图(橙色/" OuterView"),使用所需的乘数 - 在此示例中我使用了0.9。

enter image description here