UIKit技术问题:隐藏父视图myView时如何不隐藏其子按钮?
解决方案
问题本质
UIView的isHidden属性是递归生效的——当你把父视图设为隐藏时,它的所有子视图都会被强制隐藏,哪怕子视图自己的isHidden是false也没用。所以直接用myView.isHidden = true无法实现你的需求,得换思路。
可行方案
方案1:把Button移出myView的层级(推荐)
把Button从myView的子视图列表中移除,添加到myView的父视图里,同时保持它的位置和原来一致。这样myView的隐藏状态就不会影响Button了。
代码示例(Frame布局):
// 先记录Button相对于myView父视图的位置 let targetFrame = myView.convert(button.frame, to: myView.superview) // 移除Button button.removeFromSuperview() // 添加到myView的父视图 myView.superview?.addSubview(button) // 还原位置 button.frame = targetFrame // 现在隐藏myView就不会影响Button了 myView.isHidden = true
代码示例(AutoLayout布局):
如果用的是AutoLayout,需要重新给Button设置相对于父视图的约束(对应原来相对于myView的约束):
button.removeFromSuperview() guard let parentView = myView.superview else { return } parentView.addSubview(button) button.translatesAutoresizingMaskIntoConstraints = false // 这里根据你原来的约束调整,比如Button在myView里是居中、或者贴边 NSLayoutConstraint.activate([ button.centerXAnchor.constraint(equalTo: myView.centerXAnchor), button.centerYAnchor.constraint(equalTo: myView.centerYAnchor), button.widthAnchor.constraint(equalToConstant: 100), button.heightAnchor.constraint(equalToConstant: 44) ]) myView.isHidden = true
方案2:不隐藏myView,只隐藏它的非Button内容
如果不想调整视图层级,可以让myView保持显示,但隐藏它的背景、边框和除了Button之外的所有子视图:
// 清除myView的背景 myView.backgroundColor = .clear // 隐藏除Button外的所有子视图 for subview in myView.subviews { if subview !== button { subview.isHidden = true } } // 如果myView有边框,也可以去掉 myView.layer.borderWidth = 0 // 这样视觉上myView"消失"了,但Button还在
内容的提问来源于stack exchange,提问作者Md. Ashikur Rahman
相关产品推荐
相关产品推荐

