iOS 15 下 UITextField 设置 heightAnchor 为 0 及 isHidden 无效求助
问题原因
iOS 15 对 UITextField 的默认布局和绘制规则做了调整,你的实现逻辑方向没问题,失效是两个iOS 15的特性变更导致的:
UITextField默认的clipsToBounds实际生效规则调整,就算高度被设为0,超出bounds的内容、背景色依然会被绘制出来,视觉上看起来和没隐藏一样- 系统对约束变更后的自动布局触发时机做了调整,你修改约束后没有显式触发布局更新,新的约束没有被立即应用
你提到的isHidden无效大概率是误解:如果你只设置isHidden = true,没有同步修改UITextField的高度约束,它依然会占据32pt的高度,下方的testView不会向上偏移,会让你误以为文本框没有隐藏。
修复方案
方案1:继续用高度约束实现隐藏(推荐,可实现平滑动画,下方视图自动偏移)
- 在
mytextFeild的初始化代码中添加clipsToBounds = true配置,代码如下:
private lazy var mytextFeild: UITextField = { let textField = UITextField() textField.translatesAutoresizingMaskIntoConstraints = false textField.text = "Hello world" textField.backgroundColor = .green textField.clipsToBounds = true // 新增这行 return textField }()
- 优化按钮点击的约束修改逻辑,不需要反复销毁创建约束,直接修改约束的
constant后触发布局即可:
@objc func buttonTapped() { heightConstraint?.constant = 0 view.layoutIfNeeded() // 显式触发布局更新 }
如果需要做显示/隐藏切换,只要加个标志位控制constant在32和0之间切换即可。
方案2:用isHidden实现
如果不需要布局动画,只想直接隐藏文本框,同时让下方视图上移,需要同步修改两个配置:
@objc func buttonTapped() { mytextFeild.isHidden = true heightConstraint?.constant = 0 view.layoutIfNeeded() }
内容的提问来源于stack exchange,提问作者raunakrocks
相关产品推荐
相关产品推荐

