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

Posted

技术标签:

【中文标题】没有子视图时更新uilabel的宽度【英文标题】:Updating width of uilabel when subview not 【发布时间】:2015-05-12 07:57:45 【问题描述】:

我在UITableViewCell 中有UILabel,其相邻子视图为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 有尾随空间。

【问题讨论】:

你已经为UILabel添加了约束-移除水平空间约束并尝试。 【参考方案1】:

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

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

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

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

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

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

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

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

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

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

1) 当 UISwitch 可见时,将 UILabel 的尾销约束设置为你想要的边距 + UISwitch 的宽度 + 你想要的 UISwitch 左边的边距。

2)当UISwitch要隐藏时,设置UILabel的尾部pin约束为你想要的superview的margin。

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

【讨论】:

对于选项1:当你说包含视图时,你的意思是我应该另一个视图来包含UISwitch吗?当您说“标签固定到开关视图”时,您的意思是标签和开关视图之间的水平间距吗? 是的。添加一个视图来保存你的 UISwitch。目的是使其易于删除并重新添加。正如您所怀疑的那样,我所说的针脚是指水平间距。因此,从 UILabel 尾随到新视图以及从视图尾随到其父视图(边缘)添加约束。如果您希望 UISwitch 位于单元格的中间,您也可以在其容器中垂直居中新视图。 感谢您的详细回答。包含视图的开关的预期框架是什么?它应该包装uicontrolswitch吗?还是单元格的框架? 视图只是用来保存UISwitch。如果您使用故事板,您实际上可以选择开关,然后在 xcode 菜单上选择 Editor -> Embed In -> View。这将为您提供一个视图。然后更新约束。 你建议的这个约束设置,迫使我更新 UILabel 的宽度以避免歧义。

以上是关于没有子视图时更新uilabel的宽度的主要内容,如果未能解决你的问题,请参考以下文章

子容器视图中的 UILabel 未更新

UIWindow 在 addSubview 之后不更新子视图

如何从 iPhone 中的子视图更新超级视图 UILabel 文本?

超级视图框架更改后更新子视图的约束

发布的数据更新子视图但不更新父视图

有没有办法组合两个 UI 元素?