繁体   English   中英

如何以编程方式交换两个按钮的约束?

[英]How to swap two buttons' constraints programmatically?

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

我正在寻找这个问题的答案,我最终以下面的方式做到了:(代码示例在Swift 3

假设您有一个名为containerView的UIView,它包含两个subviewAsubviewAsubviewB

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

此解决方案还假设约束具有“First Item” subViewAsubViewB以及“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,您在运行时意味着代码。 约束项( 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 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM