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我想到了这一点,但是仅仅为此添加另一个视图感觉像是一种黑客行为。它不是主屏幕,并且在我需要更新约束时边界属性不正确。这就是为什么我使用“让我们说”,但这并不重要。了解视图的宽度很容易,这取决于您是如何创建它的。因为我希望一个视图的宽度与另一个视图的宽度成比例。既然我在设置约束时没有正确的帧,那么如何使用常量实现这一点?