不在子视图时更新uilabel的宽度

时间:2015-05-12 07:57:45

标签: ios uitableview autolayout uilabel

UILabel UITableViewCell的相邻子视图为UIControlSwitch。隐藏UIControlSwitch后,预计UILabel's宽度会增加。下面是我的自定义类实现:

    - (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之间设置了尾随空格,则控件部分隐藏在屏幕边界之外。因此,UILabel的约束具有超视图的尾随空格而不是UIControlSwitch

1 个答案:

答案 0 :(得分:1)

隐藏视图时,它仍然会参与布局过程。因此,简单地隐藏UISwitch不会导致任何变化。

因此,您必须添加/删除约束,从包含视图中删除UISwitch或更改您执行约束的方式。

选项1:而不是隐藏/显示删除/添加。

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

而不是show,将UILabel添加回容器视图。视图将拉伸,您的UILabel将缩小。

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

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

根本不要将UILabel钉在UISwitch上。将UILabel固定在右侧和侧面,使其具有所需的位置。

因此,您的UILabel现在固定在右边缘,并带有您选择的偏移量。如果将其设置为小,则UILabel将位于开关上方/下方。如果设置为开关的宽度加上左右边距,它将显示为伸展到开关。

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

1)当要显示UISwitch时,将UILabel的尾部引脚约束设置为您想要的边距+ UISwitch的宽度+ UISwitch左边的边距。

2)当要隐藏UISwitch时,将UILabel的尾部引脚约束设置为您想要超级视图的边距。

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