如何在Objective-C中按条件添加/移除UIView实现类似Android View.GONE效果?
实现Objective-C中类似Android View.GONE的效果
当然可以!在Objective-C的视图控制器里,要实现隐藏视图同时释放其占用的屏幕空间(和Android的View.GONE完全等价),有几种非常实用的方案,根据你的布局方式(自动布局/纯Frame布局)来选择就行:
方案1:直接从父视图移除/重新添加视图
这是最直接的方式,当你不需要视图占空间时,把它从父视图中移除;需要显示时再重新添加回去。
// 隐藏并释放空间(类似GONE) [yourTargetView removeFromSuperview]; // 需要恢复显示时,重新添加到父视图 [self.view addSubview:yourTargetView]; // 如果使用了自动布局,记得重新添加之前配置好的约束
⚠️ 注意:如果你之后还要复用这个视图,一定要保留它的强引用(比如用一个IBOutlet或者成员变量持有),不要让它被ARC销毁。
方案2:自动布局下修改约束(推荐)
现在大部分iOS项目都用Auto Layout,这种方式更灵活,不需要频繁添加/移除视图:
- 给目标视图的高度(或宽度,根据需求)添加一个可修改的约束(比如用
IBOutlet关联到视图控制器) - 根据条件切换视图的隐藏状态,同时调整约束的
constant值:
// 假设你已经通过IBOutlet关联了高度约束@property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeightConstraint; if (shouldHideView) { yourTargetView.hidden = YES; self.viewHeightConstraint.constant = 0; // 把高度设为0,不占空间 } else { yourTargetView.hidden = NO; self.viewHeightConstraint.constant = 120; // 恢复原来的高度值 } // 立即更新布局 [self.view layoutIfNeeded];
如果是横向布局,只需要把高度约束换成宽度约束即可。你也可以同时调整视图的top/bottom(或leading/trailing)约束,让相邻视图自动填充空白。
方案3:纯Frame布局下调整Frame
如果你的项目还在使用纯Frame布局,直接把视图的Frame设为CGRectZero即可:
if (shouldHideView) { yourTargetView.hidden = YES; yourTargetView.frame = CGRectZero; } else { yourTargetView.hidden = NO; yourTargetView.frame = CGRectMake(20, 40, 280, 120); // 恢复原来的Frame }
⚠️ 注意:这种方式在Auto Layout环境下会失效,因为Auto Layout会自动覆盖你设置的Frame。
内容的提问来源于stack exchange,提问作者Keselme
相关产品推荐
相关产品推荐

