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

时间:2014-10-18 12:08:37

标签: ios uiview view autolayout nslayoutconstraint

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

Screenshot

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

是否有一种快速方法可以将约束从一个UIView复制并添加到另一个?{/ p>

2 个答案:

答案 0 :(得分:17)

没有快捷的方式。

我已经完成了对超视图约束的循环。

目标C

$.ajax({
    url: 'serverurl here',
    dataType: 'JSONP',
    jsonpCallback: 'callback',
    type: 'GET',
    success: function (data) {
        console.log(data);
    },
    error:function(data){
      alert(data);  
    },
});

夫特

+ (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]];
        }
    }
}

注意

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

答案 1 :(得分:4)

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

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

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

但是,如果你真的想将一个视图的约束复制到另一个视图上,在运行时,一般来说,你必须编写一个实用程序方法,从最开始进行递归搜索祖先超级视图可能具有影响正在复制的视图的任何约束,并创建应用于其他视图的重复约束。这样的函数可能已经写在一个AL辅助库中,比如FLKAutoLayout。