将IB创建的约束复制到另一个UIView

tGi*_*ani 12 view uiview ios autolayout nslayoutconstraint

UITableView在屏幕上列出了其他视图元素.当没有要显示的交易时,我打算用另一个视图替换此列表.为此,我需要复制附加的所有约束UITableView并将它们添加到new UIView.

截图

我已经尝试复制.constraints()属性值,但它返回nil,因为约束附加到superview.获得约束superview也会产生附加到其他子视图的所有约束.

是否有快速复制和添加约束的方法UIView

Cœu*_*œur 18

没有快捷的方法.

我已经通过超视图约束的循环完成了它.

Objective-C的

+ (void)copyConstraintsFromView:(UIView *)sourceView toView:(UIView *)destView
{
    for (NSLayoutConstraint *constraint in sourceView.superview.constraints) {
        if (constraint.firstItem == sourceView)
        {
            [sourceView.superview addConstraint:[NSLayoutConstraint constraintWithItem:destView attribute:constraint.firstAttribute relatedBy:constraint.relation toItem:constraint.secondItem attribute:constraint.secondAttribute multiplier:constraint.multiplier constant:constraint.constant]];
        }
        else if (constraint.secondItem == sourceView)
        {
            [sourceView.superview addConstraint:[NSLayoutConstraint constraintWithItem:constraint.firstItem attribute:constraint.firstAttribute relatedBy:constraint.relation toItem:destView attribute:constraint.secondAttribute multiplier:constraint.multiplier constant:constraint.constant]];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

迅速

static func copyConstraints(fromView sourceView: UIView, toView destView: UIView) {
    guard let sourceViewSuperview = sourceView.superview else {
        return
    }
    for constraint in sourceViewSuperview.constraints {
        if constraint.firstItem as? UIView == sourceView {
            sourceViewSuperview.addConstraint(NSLayoutConstraint(item: destView, attribute: constraint.firstAttribute, relatedBy: constraint.relation, toItem: constraint.secondItem, attribute: constraint.secondAttribute, multiplier: constraint.multiplier, constant: constraint.constant))
        } else if constraint.secondItem as? UIView == sourceView {
            sourceViewSuperview.addConstraint(NSLayoutConstraint(item: constraint.firstItem, attribute: constraint.firstAttribute, relatedBy: constraint.relation, toItem: destView, attribute: constraint.secondAttribute, multiplier: constraint.multiplier, constant: constraint.constant))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意

请记住,只有在将destView添加到视图层次结构后才能复制约束.


alg*_*gal 4

不,系统中没有为此内置任何内容。

NSLayoutConstraint除了优先级之外,对象是不可变的,constant因此一旦创建了对象,就不能简单地将“相同”约束应用于另一个视图(其中“相同”意味着对象标识或对象相等)。

如果性能允许,而不是设置和拆除具有所有约束的视图,我只需将表视图和无数据对应视图设置为同级视图,使用一个辅助函数在每个视图上安装等效的约束,以便它们布局相同,但一个在另一个之上。然后我只需交换哪个视图与该hidden属性可见。

但是,如果您确实想在运行时以一般方式将一个视图的约束复制到另一个视图上,则必须编写一个实用程序方法,该方法从最祖先的超级视图开始进行递归搜索,该超级视图可能具有影响视图的任何约束。视图被复制,并创建应用于另一个视图的重复约束。这样的函数可能已经编写在 AL 帮助程序库之一中,例如 FLKAutoLayout。