You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 15 下 UITextField 设置 heightAnchor 为 0 及 isHidden 无效求助

问题原因

iOS 15 对 UITextField 的默认布局和绘制规则做了调整,你的实现逻辑方向没问题,失效是两个iOS 15的特性变更导致的:

  1. UITextField 默认的 clipsToBounds 实际生效规则调整,就算高度被设为0,超出bounds的内容、背景色依然会被绘制出来,视觉上看起来和没隐藏一样
  2. 系统对约束变更后的自动布局触发时机做了调整,你修改约束后没有显式触发布局更新,新的约束没有被立即应用
    你提到的isHidden无效大概率是误解:如果你只设置isHidden = true,没有同步修改UITextField的高度约束,它依然会占据32pt的高度,下方的testView不会向上偏移,会让你误以为文本框没有隐藏。

修复方案

方案1:继续用高度约束实现隐藏(推荐,可实现平滑动画,下方视图自动偏移)

  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
}()
  1. 优化按钮点击的约束修改逻辑,不需要反复销毁创建约束,直接修改约束的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:57:01