Xcode Swift:如何实现UITextField编辑时自动显隐底部边框
问题解决方案
现有代码存在的问题
- 你当前写的
removeBottomBorder方法逻辑错误:没有删除已有的底部边框层,而是新增了一层深色图层叠加,每次触发编辑状态切换都会新增图层,长期使用会造成冗余内存占用,文本框尺寸变化时还会出现边框错位的问题 - 视图控制器的代理方法逻辑冗余:不需要手动枚举所有文本框调用方法,直接用代理方法传入的当前触发事件的
textField对象操作即可
优化后的UITextField扩展代码
import UIKit // 关联对象key,用于存储底部边框层 private var bottomBorderKey: UInt8 = 0 extension UITextField { // 用关联对象绑定底部边框层,避免重复创建 private var bottomBorder: CALayer? { get { objc_getAssociatedObject(self, &bottomBorderKey) as? CALayer } set { objc_setAssociatedObject(self, &bottomBorderKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } func addBottomBorder() { // 已有边框则直接显示,避免重复创建 if let border = bottomBorder { border.isHidden = false return } let bottomLine = CALayer() bottomLine.frame = CGRect(x: 0, y: self.frame.height - 1, width: self.frame.width, height: 1) bottomLine.backgroundColor = UIColor.white.cgColor borderStyle = .none layer.addSublayer(bottomLine) layer.masksToBounds = true self.bottomBorder = bottomLine } func removeBottomBorder() { // 直接隐藏边框层,无需销毁,下次调用add方法可直接复用 bottomBorder?.isHidden = true } // 可选:适配文本框尺寸变化(如旋转屏幕、动态调整布局) override open func layoutSubviews() { super.layoutSubviews() bottomBorder?.frame = CGRect(x: 0, y: self.frame.height - 1, width: self.frame.width, height: 1) } }
优化后的视图控制器代码
// 仅操作当前触发编辑事件的文本框,后续新增文本框无需修改此部分逻辑 func textFieldDidBeginEditing(_ textField: UITextField) { textField.addBottomBorder() } func textFieldDidEndEditing(_ textField: UITextField) { textField.removeBottomBorder() } func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true }
如果你的页面背景色不是固定深色,也可以将removeBottomBorder逻辑改成直接移除边框层,使用隐藏的方式性能更高、复用性更好。
内容的提问来源于stack exchange,提问作者Abednego David
相关产品推荐
相关产品推荐

