UITableViewCell中如何让隐藏UIView自动收缩为零尺寸,实现Android VISIBILITY_GONE效果
问题根因&解决方案
1. 自定义按钮缺少属性变更监听
你当前的实现只重写了intrinsicContentSize,但修改hidden、alpha属性时系统不会自动触发固有内容尺寸的失效更新,你需要在自定义按钮子类中重写这两个属性的setter,自动触发尺寸刷新:
- (void)setHidden:(BOOL)hidden { BOOL oldValue = self.isHidden; [super setHidden:hidden]; if (self.zeroSizeIfHidden && oldValue != hidden) { [self invalidateIntrinsicContentSize]; } } - (void)setAlpha:(CGFloat)alpha { CGFloat oldValue = self.alpha; [super setAlpha:alpha]; if (self.zeroSizeIfHidden && ((oldValue == 0) != (alpha == 0))) { [self invalidateIntrinsicContentSize]; } }
2. 布局更新范围不正确
你当前只触发了按钮和其直接父视图的布局刷新,但UITableViewCell的高度变化需要通知UITableView重新计算行高才能生效,修改按钮状态后补充以下代码即可:
// 写在你的cell状态更新逻辑最后 // 实际开发建议用响应链遍历的方式获取tableView,兼容性更强 UITableView *tableView = (UITableView *)self.superview.superview; [tableView performBatchUpdates:^{ // 空更新块即可触发tableView重新计算所有行高 } completion:nil]; // 适配旧版本iOS可替换为 [tableView beginUpdates];[tableView endUpdates];
3. 约束优先级校验
请确认你的按钮没有添加固定宽高约束,且按钮的Content Hugging Priority(内容吸附优先级)高于相邻视图的对应优先级,避免intrinsicContentSize被其他约束覆盖失效。
备选稳定方案(无需重写intrinsicContentSize)
如果上述方案仍有问题,推荐使用约束切换的方案实现类VISIBILITY_GONE效果,稳定性更高:
- 在XIB中给按钮添加宽度、高度两个约束,优先级设为750(低于Required级别的1000),默认不勾选
Installed - 按钮需要隐藏时,勾选安装这两个约束,将constant设为0
- 按钮需要显示时,取消安装这两个约束
- 修改后同样调用tableView的batch updates触发行高刷新即可
内容的提问来源于stack exchange,提问作者Anticro
相关产品推荐
相关产品推荐

