NSAutolayoutConstraint - 在乘数前应用常量

问题描述:

今天multiplier属性是只读的。为了改变它,你必须删除约束并创建一个新约束。NSAutolayoutConstraint - 在乘数前应用常量

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。我如何创建这样的约束?因为我最终失去的是来自于故事板constraint.constant

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

我也不想这样做。

+0

'view.width =(superview.width - 2)* multiplier'这其中也可能崩溃 –

+0

FWIW您使用的旧路更难写你的约束。改用锚点。见[这里](https://www.raywenderlich.com/125718/coding-auto-layout)和[here](https://*.com/questions/44074872/programatic-constraints-not-obeyed/44078258# 44078258) – Honey

+0

在这种情况下,我没有(或想要)指向视图的指针,所以只限于约束。那么在这种情况下,我将如何使用锚? –

假设你的superView是主屏幕。

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

这不是主屏幕,当我需要更新约束时,边界属性不正确。 –

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

你为什么要改变乘数值?更改恒定值,而不是..

声明里面的类

var yourViewWidthConstraint: NSLayoutConstraint? 

实例化这个约束

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

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

+0

因为我希望一个视图的宽度与另一个视图的宽度成正比。我怎样才能做到这一点,因为我在设置约束时没有正确的框架? –

在这些图像中,紫色是“ SuperView“...橙色是”外部视图“...蓝色是”内部视图“

为了您的使用,紫色和橙色可能会有.clear背景颜色。

“SuperView”的宽度约束控制其两个子视图的宽度 - 在本例中,Orange的宽度为-2,蓝色的宽度为0.9(0.9倍)。


“SuperView”被简单地设置为宽度和高度,并居中在其父视图中。

enter image description here


“OuterView” 被设定为等于宽度到它的父(紫色/ “的SuperView”),具有恒定的-2(没有乘数)

enter image description here


“InnerView”被设置为等于 superview(Orange /“OuterView”),wi th期望的乘数 - 在本例中我使用了0.9。

enter image description here