没有子视图时更新 uilabel 的宽度

Updating width of uilabel when subview not

我在 UITableViewCell 中有 UILabel,其相邻子视图是 UIControlSwitch。当 UIControlSwitch 被隐藏时, UILabel's 宽度预计会增加。下面是我的自定义 class 实现:

    - (void)setBounds:(CGRect)bounds
  {
    [super setBounds:bounds];

    self.contentView.frame = self.bounds;
  }

   - (void)layoutSubviews
  {
     [super layoutSubviews];

     [self.contentView updateConstraintsIfNeeded];
     [self.contentView layoutIfNeeded];

     self.numberLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.numberLabel.frame);
     self.quoteLabel.preferredMaxLayoutWidth =    CGRectGetWidth(self.quoteLabel.frame);
 }

   @end

我已经上传了一个示例 code 来解释情节提要上的限制。

UILabel's 宽度没有变化。如果我在 UILabelUIControlSwitch 之间设置一个尾随 space,该控件将部分隐藏在屏幕边界之外。因此 UILabel 的约束有尾随 space 到父视图而不是 UIControlSwitch

隐藏视图时,它仍会参与布局过程。所以简单地隐藏你的 UISwitch 不会导致任何改变。

因此您要么必须 add/remove 约束,从其包含的视图中删除 UISwitch,要么更改您执行约束的方式。

选项 1:代替 hide/show 执行 remove/add.

如果将 UISwitch 放在它自己的视图中,则可以将 UILabel 固定到包含视图的开关。不要隐藏 UISwitch,而是将其从包含它的视图中移除。结果将是包含视图折叠,只要标签固定到开关视图并将开关视图固定到边缘,您的 UILabel 就会拉伸。

不显示,而是将 UILabel 添加回容器视图。视图将拉伸,您的 UILabel 将收缩。

选项 2:对 UILabel 使用简单的尾随约束。

让你的 UILabel 有一个到超级视图的尾随约束,然后 CTRL 将该约束拖到你的代码中,这样你就可以设置它的值。或者,如果您正在这样做,您可以手动添加它。

根本不要将 UILabel 固定到 UISwitch。将 UILabel 固定到右侧 h§and 侧,使其具有所需的位置。

因此,您的 UILabel 现在已固定到右边缘,并带有您选择的偏移量。如果你设置这个小,UILabel 将被 over/under 开关。如果设置为开关的宽度加上左右边距,它看起来会拉伸到开关。

在您的代码中,您可以通过查看其框架找到 UISwitch 的宽度。

1)当UISwitch可见时,将UILabel的trailing pin constraint设置为你想要的边距+UISwitch的宽度+你想要的UISwitch的左边边距。

2) 隐藏UISwitch时,将UILabel的trailing pin constraint设置为你想要的superview的margin。

这应该会导致 UILabel 在开关未隐藏时延伸到开关,或者在开关隐藏时延伸到边缘。