Xcode中文本框占位符不显示?Xcode8正常Xcode9异常求助
解决Xcode9中文本框占位符不显示的问题
嘿,作为刚接触iOS开发的新手,碰到Xcode版本升级导致的功能失效确实挺头疼的!别担心,Xcode9对应iOS11 SDK,苹果在UITextField的占位符机制上确实有一些变更,我给你整理几个大概率能解决问题的方向:
1. 统一用正确的API设置占位符
iOS11开始,UITextField的占位符渲染逻辑对属性设置的优先级更严格了:
- 如果你之前同时混用
placeholder和attributedPlaceholder,或者自定义文本框字体、颜色后没同步处理占位符,就可能导致占位符不显示。 - 解决办法:
- 不需要自定义样式的话,直接简单设置:
textField.placeholder = "请输入手机号" - 需要自定义样式(比如改颜色、字体),一定要用
attributedPlaceholder统一设置,示例代码:let placeholderAttrs: [NSAttributedString.Key: Any] = [ .foregroundColor: UIColor(red: 0.7, green: 0.7, blue: 0.7, alpha: 1.0), .font: UIFont.systemFont(ofSize: 15) ] textField.attributedPlaceholder = NSAttributedString(string: "请输入密码", attributes: placeholderAttrs)
- 不需要自定义样式的话,直接简单设置:
2. 排查自动布局是否裁剪了占位符
Xcode9的自动布局引擎和iOS11的UITextField intrinsicContentSize计算有优化,如果你的文本框高度设置得太小,占位符会被裁剪掉,看起来就像没显示:
- 解决办法:
- 确保文本框高度足够,比如至少设置为
字体行高 + 8(上下留足够边距); - 或者不要固定高度,让文本框根据内容自动调整,给文本框设置合适的
contentHuggingPriority和contentCompressionResistancePriority。
- 确保文本框高度足够,比如至少设置为
3. 检查占位符与背景色是否冲突
这个小细节很容易被忽略:如果你的占位符颜色和文本框背景色太接近甚至一样,自然看不到占位符。iOS11默认的占位符颜色比之前更浅一些,可能刚好和你的背景色重合了:
- 解决办法:显式设置占位符的颜色,就像上面
attributedPlaceholder示例里那样,选一个和背景色反差明显的浅灰色。
4. 检查自定义UITextField子类的适配问题
如果你用了自己写的UITextField子类,并且重写了drawPlaceholder(in:)方法,那在iOS11下这个方法的逻辑可能和之前不兼容:
- 解决办法:
- 尽量改用
attributedPlaceholder来设置占位符样式,避免重写绘制方法; - 如果必须重写,记得调用
super.drawPlaceholder(in:),并且检查绘制的rect范围是否正确适配iOS11的布局。
- 尽量改用
5. 清理项目缓存试试
Xcode升级后经常会有缓存残留导致渲染异常,这时候简单的清理就能解决问题:
- 按下
Command+Shift+K清理项目; - 再按下
Command+Option+Shift+K清理构建缓存; - 然后重新编译运行项目。
内容的提问来源于stack exchange,提问作者user9323924
相关产品推荐
相关产品推荐

