如果您将文本设置为UILabel,它将更新其内容大小以显示所有内容。我想对自定义按钮做同样的事情。但我不想改变文本,我想把按钮缩小到零大小,如果它被隐藏的话。(类似Android的visbility_gone)
所以我再次使用自动布局系统,无法解决这个问题:
在我的XIB文件我已经定义了一个按钮。按钮是一个自定义子类,它覆盖intrinsicContentSize
。如果按钮是隐藏的,或者它的alpha值被设置为0,则intrinsicContentSize将为(0,0),否则为实际的固有大小。
- (CGSize)intrinsicContentSize{
if (self.zeroSizeIfHidden && (self.hidden || self.alpha == 0)) {
return CGSizeZero;
}
CGSize const size = [super intrinsicContentSize];
return size;
}
现在我试着告诉布局系统更新所有相关的布局约束,失败了。按钮应该在UITableViewCell中可见-但它没有。它只会在下一个"淡出"页面上弹出。动画和隐藏。不,如果不需要,我不能简单地从屏幕上删除它。当用户轻拍它时,细胞会生长和收缩。
这是我到目前为止所尝试的,从我的UITableViewCell:
if (self.button.hidden || self.button.alpha == 0) {
self.button.hidden = NO;
self.button.alpha = 1;
[self.button invalidateIntrinsicContentSize];
[self.button setNeedsLayout];
[self.button layoutIfNeeded];
[self.button.superview invalidateIntrinsicContentSize];
[self.button.superview setNeedsLayout];
[self.button.superview layoutIfNeeded];
}
我错过了什么?有什么我还没尝试过的吗?我想我需要一些自动布局专家的帮助。
背景:单元格本身是使用自动布局构建的。它会显示一些信息,当你点击它时,它会扩展为完整的信息。在几种情况下,应该显示完整的信息和按钮。
编辑:
我正在寻找一些想法,如何我可以强制自动布局机制来查询我的按钮的新大小。
(要看到它的作用:它是"Info &Documentation""POI工具箱"的表视图。只需点击"按钮在地图屏幕的右下方。(应用商店:https://apps.apple.com/de/app/poi-toolbox/id1547993322))
我正面临着自动布局约束的问题。每个单元格使用一个自定义背景视图。因此,下面单元格的BG视图隐藏了按钮,而按钮本身只是放置在可见区域之外。
这个实现对于自定义按钮是正确的:
- (CGSize)intrinsicContentSize{
if (self.zeroSizeIfHidden && (self.hidden || self.alpha == 0)) {
return CGSizeZero;
}
CGSize const size = [super intrinsicContentSize];
return size;
}
或者如果你喜欢短的变体,不需要调试:
- (CGSize)intrinsicContentSize{
return (self.zeroSizeIfHidden && (self.hidden || self.alpha == 0))
? CGSizeZero : [super intrinsicContentSize];
}
对于cell,这就足够了:
// Code...
if (self.button.hidden || self.button.alpha == 0) {
self.button.hidden = NO;
self.button.alpha = 1;
}
// Code...
当表视图重新加载行时,按钮的大小正在更新。