如何交换两个按钮'约束编程?

时间:2015-07-23 08:30:46

标签: ios objective-c

在同一视图中有两个名为buttonAbuttonB的按钮,我在故事板中设置了它们的约束。如何以编程方式交换约束?

2 个答案:

答案 0 :(得分:2)

我正在寻找答案,我最终以下列方式做到了: (代码示例在myOutputs

我们假设您有一个名为Swift 3的UIView,其中包含两个UIView:containerViewsubviewA

子视图的约束实际上是在subviewB内定义的(根据"最近共同祖先的规则")。

此解决方案还假设约束具有“第一项”作为“第一项”。 containerViewsubViewA以及'第二项' 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,您在运行时意味着使用代码。 约束项(firstItemsecondItem)是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中)