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
)
:
我也不想这样做。
假设你的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
任何地方..
因为我希望一个视图的宽度与另一个视图的宽度成正比。我怎样才能做到这一点,因为我在设置约束时没有正确的框架? –
在这些图像中,紫色是“ SuperView“...橙色是”外部视图“...蓝色是”内部视图“
为了您的使用,紫色和橙色可能会有.clear
背景颜色。
“SuperView”的宽度约束控制其两个子视图的宽度 - 在本例中,Orange的宽度为-2
,蓝色的宽度为0.9(0.9倍)。
“SuperView”被简单地设置为宽度和高度,并居中在其父视图中。
“OuterView” 被设定为等于宽度到它的父(紫色/ “的SuperView”),具有恒定的-2
(没有乘数)
“InnerView”被设置为等于其 superview(Orange /“OuterView”),wi th期望的乘数 - 在本例中我使用了0.9。
'view.width =(superview.width - 2)* multiplier'这其中也可能崩溃 –
FWIW您使用的旧路更难写你的约束。改用锚点。见[这里](https://www.raywenderlich.com/125718/coding-auto-layout)和[here](https://*.com/questions/44074872/programatic-constraints-not-obeyed/44078258# 44078258) – Honey
在这种情况下,我没有(或想要)指向视图的指针,所以只限于约束。那么在这种情况下,我将如何使用锚? –