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
宽度没有变化。如果我在UILabel
和UIControlSwitch
之间设置了尾随空格,则控件部分隐藏在屏幕边界之外。因此,UILabel
的约束具有超视图的尾随空格而不是UIControlSwitch
。
答案 0 :(得分:1)
隐藏视图时,它仍然会参与布局过程。因此,简单地隐藏UISwitch不会导致任何变化。
因此,您必须添加/删除约束,从包含视图中删除UISwitch或更改您执行约束的方式。
如果将UISwitch放在自己的视图中,可以将UILabel固定到包含视图的开关。而不是隐藏UISwitch,将其从包含视图中删除。结果将是包含视图折叠,只要标签固定到开关视图并且开关视图到边缘,您的UILabel就会拉伸。
而不是show,将UILabel添加回容器视图。视图将拉伸,您的UILabel将缩小。
让你的UILabel对superview有一个尾随约束,CTRL将该约束拖到你的代码中,这样你就可以设置它的值。或者你可以手动添加它,如果你正在做的那样。
根本不要将UILabel钉在UISwitch上。将UILabel固定在右侧和侧面,使其具有所需的位置。
因此,您的UILabel现在固定在右边缘,并带有您选择的偏移量。如果将其设置为小,则UILabel将位于开关上方/下方。如果设置为开关的宽度加上左右边距,它将显示为伸展到开关。
在您的代码中,您可以通过查看其框架来查找UISwitch的宽度。
1)当要显示UISwitch时,将UILabel的尾部引脚约束设置为您想要的边距+ UISwitch的宽度+ UISwitch左边的边距。
2)当要隐藏UISwitch时,将UILabel的尾部引脚约束设置为您想要超级视图的边距。
这会导致UILabel在未隐藏时延伸到开关,或者在隐藏开关时延伸到边缘。