繁体   English   中英

隐藏一个或多个视图时,使用自动布局移动UIView

[英]Shifting UIViews with Auto Layout when one ore more views are hidden

我有一个带有标题的视图。 该标题有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 ),要解决此问题,有两种可能性可能是过度约束或更改常量。 我对自动布局非常陌生,并且我一直使用视觉格式语言(因为我仅使用代码构建视图),因此我不理解如何将这种解决方案应用于我的案例。

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

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

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

在ViewWillLayoutSubviews上

  1. 检查数组[1、2、3、4]
  2. 删除所有约束
  3. 根据您的内容数组设置新的约束。 这里重要的是将数组的元素检查为nil。 自动布局无法正确处理nil元素,并且会失败。

消除约束:

//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

}

暂无
暂无

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

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