Material TextField 进阶指南:浮动占位符、错误校验与自动高度动画,快速提升 iOS 表单体验
【免费下载链接】MaterialA UI/UX framework for creating beautiful applications.项目地址: https://gitcode.com/gh_mirrors/mat/Material
Material 是一款面向 iOS 的 UI/UX 组件框架,其TextField组件用「浮动占位符 + 错误校验 + 自动高度动画」三件套,帮你的表单告别生硬的原生输入框,打造流畅、美观且易用的 iOS 表单体验。
本文面向新手开发者,用尽量少的代码带你掌握这三项进阶能力,并给出常用属性的速查表 📝。
为什么 TextField 值得专门研究?
注册、登录、搜索、留言……几乎每个 App 都离不开输入框。原生UITextField只能显示一行灰色占位文字,而 Material 的 TextField 原生支持:
- ✨浮动占位符:聚焦时标签自动上浮缩小,成为「字段名」常驻提示
- 🚨错误提示:校验失败时在底部显示红字错误信息
- 📏自动增高:多行输入时高度随内容平滑增长
这些能力都集中在 Sources/iOS/Text/ 目录中,下面逐一拆解。
浮动占位符:聚焦时优雅上浮的字段标签
Material 的占位符是一个真实的UILabel,而非UITextField的系统占位文字。当用户聚焦输入框时,它会以 0.15 秒的动画上浮到输入框顶部并缩小(默认缩放为 0.75 倍),退出聚焦后若无内容则回落原位。相关动画逻辑见 placeholderEditingDidBeginAnimation。
几个常用调节项(均支持 Storyboard 的@IBInspectable,无需写代码即可调整):
| 属性 | 默认值 | 作用 |
|---|---|---|
isPlaceholderAnimated | true | 是否启用浮动动画 |
placeholderActiveScale | 0.75 | 上浮后的缩小比例 |
placeholderNormalColor | 深灰 | 非聚焦时标签颜色 |
placeholderActiveColor | 主题蓝 | 聚焦时标签颜色,同时联动光标色 |
dividerNormalHeight / dividerActiveHeight | 1 / 2 | 底部分割线粗细变化,聚焦时变粗变蓝 |
💡 小贴士:分割线(divider)的颜色与粗细会随聚焦状态自动切换,配合浮动标签一起形成「正在编辑」的视觉反馈,实现见 updateDividerColor。
ErrorTextField:让表单错误「说得出哪里不对」
基础TextField只有一个detail属性用于提示文字,而真正的错误校验由 ErrorTextField 承担。它在输入框下方新增了一个errorLabel,通过两个属性即可驱动:
field.error = "密码至少 6 位" field.isErrorRevealed = trueisErrorRevealed为true时,错误信息显示、detail提示自动隐藏;两者互斥切换,版式不会打架。错误颜色默认取主题色theme.error,随 apply(theme:) 自动适配你的主题。
链式校验:一行代码声明全部规则
ErrorTextField自带了一个validator校验器(见 ErrorTextFieldValidator),支持链式调用,每个规则绑定一条错误文案:
field.validator .notEmpty(message: "请输入用户名") .min(length: 3, message: "至少 3 个字符") .noWhitespaces(message: "用户名不能含空格") .username(message: "包含非法字符")内置规则覆盖了常见场景:notEmpty(非空)、min / max(长度上下限)、email(邮箱正则)、username(用户名规则)、noWhitespaces(禁止空格),也能用validate(message:when:)挂任意自定义闭包(定义见 validate)。
点击提交时调用field.isValid()即可触发校验:失败时自动显示第一条不通过的错误信息,全部通过则隐藏错误。
自动校验:别在用户第一次输入时就「劈脸报错」
校验器提供autoValidationType控制输入过程中的自动校验策略(见 AutoValidationType):
| 策略 | 行为 |
|---|---|
.none | 完全关闭自动校验,只在手动调用时生效 |
.default | 推荐值:错误首次显示后才开始自动校验 |
.always | 每次输入都实时校验 |
.custom | 传入闭包,完全自定义时机 |
新手最容易踩的坑就是.always——用户刚敲一个字母就弹红字,体验很差。用默认的.default,先等用户点过一次提交、让他知道「这个字段会校验」,再开启实时纠错,是更友好的交互节奏。
自动高度动画:让多行输入框像气泡一样生长
单行之外,Material 提供了基于UITextView的 TextView,支持随内容自动增高,并且增高过程带有平滑动画:
preferredMaxLayoutHeight:设置最大高度上限,超过后转为内部滚动。设为0则不启用自动增高;isHeightChangeAnimated(默认true):编辑状态下高度变化时,以 0.15 秒动画布局父视图,见 contentSize 的didSet;intrinsicContentSize会结合占位符高度与minimumTextHeight(32pt)计算,保证空内容时也有合适的最小高度。
如果你的需求是「带浮动占位符的多行输入框」,直接用 Editor 组件——它把TextView与浮动标签、分割线、底部detail提示组合在一起,浮动动画与聚焦样式和TextField完全一致(布局逻辑见 layoutPlaceholderLabel)。
一句话选型:
单行→
TextField/ErrorTextField;多行→Editor(内含TextView)。
常见调性问题速查
| 现象 | 调整建议 |
|---|---|
| 浮动标签与输入文字重叠 | 调大placeholderVerticalOffset |
| 占位符不想浮动 | isPlaceholderAnimated = false或placeholderAnimation = .hidden |
| 输入框右侧需要图标按钮 | isClearIconButtonEnabled(一键清空)、isVisibilityIconButtonEnabled(密码可见切换) |
| 整体风格不符 | 通过apply(theme:)使用 Theme 统一换肤,占位符、分割线、错误色全部自动跟随 |
小结
Material 的 TextField 家族把「表单体验」拆成了三个可以独立启用的开关:
- 浮动占位符——用动画告诉用户「我在哪、改什么」;
- ErrorTextField + validator 链式校验——用恰到好处的时机告诉用户「错在哪」;
- TextView 自动高度动画——让长内容输入不再挤压版面。
想深入细节,建议按以下路径阅读源码:TextField.swift、ErrorTextField.swift、ErrorTextFieldValidator.swift、TextView.swift、Editor.swift,项目整体介绍见 README.md。掌握这三件套,你的 iOS 表单体验就有了明显的「高级感」🚀。
【免费下载链接】MaterialA UI/UX framework for creating beautiful applications.项目地址: https://gitcode.com/gh_mirrors/mat/Material
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考