[英]How to swap two buttons' constraints programmatically?
在同一个视图中有两个名为buttonA
和buttonB
按钮,我在storyboard中设置了它们的约束。 如何以编程方式交换约束?
我正在寻找这个问题的答案,我最终以下面的方式做到了:(代码示例在Swift 3
)
假设您有一个名为containerView
的UIView,它包含两个subviewA
: subviewA
和subviewB
。
子视图的约束实际上是在containerView
定义的(根据“最近共同祖先”的规则)。
此解决方案还假设约束具有“First Item” subViewA
或subViewB
以及“Second Item” containerView
。 如果您的设置不同,则可能需要相应地修改代码。
所以我们有一个交换约束的函数:
private func swapFirstItemsOfConstraintsDefinedInThisView(_ superview: UIView, betweenItem item1: AnyObject, andItem item2: AnyObject)
{
var constraintsToRemove: [NSLayoutConstraint] = []
var constraintsNew_item1: [NSLayoutConstraint] = []
var constraintsNew_item2: [NSLayoutConstraint] = []
for constraint in superview.constraints
{
if (constraint.firstItem === item1)
{
constraintsToRemove.append(constraint)
constraintsNew_item1.append(NSLayoutConstraint(item: item2, attribute: constraint.firstAttribute, relatedBy: constraint.relation, toItem: constraint.secondItem, attribute: constraint.secondAttribute, multiplier: constraint.multiplier, constant: constraint.constant))
}
else if (constraint.firstItem === item2)
{
constraintsToRemove.append(constraint)
constraintsNew_item2.append(NSLayoutConstraint(item: item1, attribute: constraint.firstAttribute, relatedBy: constraint.relation, toItem: constraint.secondItem, attribute: constraint.secondAttribute, multiplier: constraint.multiplier, constant: constraint.constant))
}
}
superview.removeConstraints(constraintsToRemove);
superview.addConstraints(constraintsNew_item1);
superview.addConstraints(constraintsNew_item2);
}
那么你可以调用以下内容(在你的ViewController
):
self.swapFirstItemsOfConstraintsDefinedInThisView(self.containerView, betweenItem: subviewA, andItem: subviewB)
self.containerView.layoutIfNeeded()
请注意,除非调用layoutIfNeeded()
否则不会显示交换的效果。 根据您的需要,您可能希望将此调用添加为交换函数正文的最后一行。
顺便说一句,如果你在UIAnimation
上下文中调用layoutIfNeeded()
(在animations
关闭/块中),它将为转换设置动画。
请注意,此代码有很多潜在的改进,它只是基本方法的一个示例。 例如,我们可以有一个扩展NSLayoutConstraint
允许init
婷它通过复制另一个NSLayoutConstraint
,只有改变“第一项”财产(使我们避免上面的代码的重复长线路)。 交换函数本身也可以在UIView
的扩展中定义。 并且在性能方面,上述实现存在潜在问题。
我将假设通过Xcode,您在运行时意味着代码。 约束项( firstItem
和secondItem
)是readonly
属性(即: https : //developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutConstraint_Class/#//apple_ref/occ/instp/NSLayoutConstraint/firstItem )。
所以你可以在创建它们之后编辑它们。
您可以为每个按钮创建两组约束,并通过其active
属性激活/停用( https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutConstraint_Class/#//apple_ref/occ/instp/ NSLayoutConstraint / active )当需要时,不同的集合(可以存储在IBOutletCollection
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.