Ios NSAutolayoutConstraint-在乘法器之前应用常量

Ios NSAutolayoutConstraint-在乘法器之前应用常量,ios,swift,nslayoutconstraint,Ios,Swift,Nslayoutconstraint,如今,乘数属性是只读的。要更改它,必须删除约束并创建新约束 let newConstraint = NSLayoutConstraint( item: constraint.firstItem, attribute: constraint.firstAttribute, relatedBy: constraint.relation, toItem: constraint.secondItem, attribute: constraint.secondAtt

如今,
乘数
属性是只读的。要更改它,必须删除约束并创建新约束

let newConstraint = NSLayoutConstraint(
    item: constraint.firstItem,
    attribute: constraint.firstAttribute,
    relatedBy: constraint.relation,
    toItem: constraint.secondItem,
    attribute: constraint.secondAttribute,
    multiplier: newMultiplier,
    constant: constraint.constant
)
在本例中,首先应用乘数,然后应用常数。例如:

假设它是superview的宽度约束


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

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

我也不想做这样的事情:

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

因为我最终失去了来自故事板的
约束。常量。

假设superView是主屏幕

newConstraint.constant = (UIScreen.mainScreen().bounds.size.width - 2) * your_multiplier
您可以尝试下一步:

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
    }
}

为什么要更改乘数值?改为更改常量值

在类内声明

var yourViewWidthConstraint: NSLayoutConstraint?
实例化此约束

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

现在,更改yourViewWidthConstraint.constant
anywhere..

在这些图像中,紫色是“超级视图”。。。橙色是“外部视图”。。。蓝色是“内部视图”

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

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


“SuperView”只需设置为宽度和高度,并在其父视图中居中


“OuterView”设置为与其superview(紫色/“superview”)相等的宽度,常数为
-2
(无乘数)


“InnerView”设置为与它的superview(橙色/“OuterView”)相同的宽度,并具有所需的乘数-在本例中,我使用了0.9


view.width=(superview.width-2)*乘数
如果您使用旧的更难的方式编写约束,则此乘数也可能会崩溃。用锚代替。请参阅,在本例中,我没有(或不想)指向视图的指针,因此只指向约束。那么,在这种情况下,我将如何使用锚定呢?为了得到您想要的结果,您可能需要将视图嵌入到另一个视图中。将“OuterView”宽度约束设置为superview.width+常数
-2
,并将“InnerView”宽度约束设置为其superview.width*乘数。谢谢@DonMag我想到了这一点,但是仅仅为此添加另一个视图感觉像是一种黑客行为。它不是主屏幕,并且在我需要更新约束时边界属性不正确。这就是为什么我使用“让我们说”,但这并不重要。了解视图的宽度很容易,这取决于您是如何创建它的。因为我希望一个视图的宽度与另一个视图的宽度成比例。既然我在设置约束时没有正确的帧,那么如何使用常量实现这一点?