没有子视图时更新 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
宽度没有变化。如果我在 UILabel
和 UIControlSwitch
之间设置一个尾随 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 在开关未隐藏时延伸到开关,或者在开关隐藏时延伸到边缘。
我在 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
宽度没有变化。如果我在 UILabel
和 UIControlSwitch
之间设置一个尾随 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 在开关未隐藏时延伸到开关,或者在开关隐藏时延伸到边缘。