今天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
。
答案 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"只需设置为宽度和高度,并在其父视图中居中。
" OuterView"将等宽度设置为其超级视图(紫色/" SuperView"),常量为-2
(无乘数)
" InnerView"将等宽度设置为其超级视图(橙色/" OuterView"),使用所需的乘数 - 在此示例中我使用了0.9。