隐藏一个或多个视图时,使用Autolayout移动视图

时间:2014-03-24 20:59:00

标签: ios uiview autolayout

我有一个有标题的视图。此标题有4个视图,在右侧显示图像。我称它们为图标,因为它们每个都显示或绘制一个字形。根据数据,可以隐藏图标2,3或4,给出六种可能的组合。 即使隐藏起来,每个看不见的图标都占据着它的空间,给出了一个或多个“洞”。在可视化中。 这就是我现在正在使用的。

[header addSubview:_label];
[header addSubview:_icon1];
[header addSubview:_icon2];
[header addSubview:_icon3];
[header addSubview:_icon4];


NSDictionary *headerViewDict = NSDictionaryOfVariableBindings(_label, _icon1, _icon2, _icon3, _icon4);

[header addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-2-[_label]-0-[_icon4(>=0,14)]-1-[_icon3(>=0,14)]-1-[_icon2(>=0,14)]-1-[_icon1(14)]-2-|" options:nil metrics:nil views:headerViewDict]];
[header addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_label]|" options:nil metrics:nil views:headerViewDict]];
[header addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_icon1]|" options:nil metrics:nil views:headerViewDict]];
[header addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_icon2]|" options:nil metrics:nil views:headerViewDict]];
[header addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_icon3]|" options:nil metrics:nil views:headerViewDict]];
[header addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_icon4]|" options:nil metrics:nil views:headerViewDict]];

我刚读过(https://stackoverflow.com/a/18066138/1360888)要解决这个问题,有两种可能性过度约束或改变常数。 我对autolayout很新,我总是使用Visual Format Language(因为我只使用代码构建我的视图),所以我不明白如何将该解决方案应用到我的案例中。

如何为我的视图创建流畅的布局?

注意:在我的应用程序中,我有很多视图,例如标题同时可见,因此性能很重要。

1 个答案:

答案 0 :(得分:0)

我要做的是创建一个图标数组(如你所说,UIImageViews?)。然后根据您的数据更新数组的内容。

在ViewWillLayoutSubviews

  1. 检查阵列[1,2,3,4]
  2. 删除所有约束
  3. 根据您的内容数组设置新约束。这里重要的是检查数组的元素为nil。 Autolayout不会正确处理nil元素并失败。
  4. 删除约束:

    //Clear the constraints
    for (NSLayoutConstraint *constraint in [self.view constraints]) {
        [self.view removeConstraint:constraint];
    }
    

    添加约束:

    if (myCustomView) {//constraintsWithVisualFormat does not support handling nil
        //Add constraints for myCustomView Here
    }
    

    ViewWillLayoutSubviews

    /**
     * Update the constraints before laying subviews
     *
     */
    - (void) viewWillLayoutSubviews
    {
        [super viewWillLayoutSubviews];
    
        //Remove constraints
    
        //Set new constraints
    
    }