在同一视图中有两个名为buttonA
和buttonB
的按钮,我在故事板中设置了它们的约束。如何以编程方式交换约束?
答案 0 :(得分:2)
我正在寻找答案,我最终以下列方式做到了:
(代码示例在myOutputs
)
我们假设您有一个名为Swift 3
的UIView,其中包含两个UIView:containerView
和subviewA
。
子视图的约束实际上是在subviewB
内定义的(根据"最近共同祖先的规则")。
此解决方案还假设约束具有“第一项”作为“第一项”。 containerView
或subViewA
以及'第二项' subViewB
。如果您的设置不同,则可能需要相应地修改代码。
所以我们有一个交换约束的函数:
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()
上下文中调用layoutIfNeeded()
(在UIAnimation
闭包/阻止中),则会为转换设置动画。
请注意,此代码有很多潜在的改进,它只是基本方法的一个示例。例如,我们可以在animations
上设置一个附加信息,允许NSLayoutConstraint
通过复制另一个init
并仅更改“第一项”&#39}来实现NSLayoutConstraint
。 property(这样我们就可以避免上面重复的长代码行)。交换函数本身也可以在UIView
的扩展名中定义。在性能方面,上述实施存在潜在问题。
答案 1 :(得分:-1)
我将假设通过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
中)