如何修改UITextField输入宽度以避免与‘Vergessen?’按钮重叠?
如何调整UITextField输入区域避免与右侧按钮重叠?
当然可以解决这个问题!你遇到的输入区域和右侧「Vergessen?」按钮重叠的情况,其实可以通过调整UITextField的文本区域范围,或者优化按钮的布局来轻松解决,结合你的代码给你两种实用方案:
方法一:自定义UITextField子类,精准控制文本区域
最稳妥的方式是自定义一个UITextField子类,重写文本区域的计算方法,让它根据右侧按钮的显示状态自动调整输入区域的宽度,确保文本不会跑到按钮下方。
class CustomPasswordTextField: UITextField { override func textRect(forBounds bounds: CGRect) -> CGRect { var textRect = super.textRect(forBounds: bounds) // 非编辑状态下rightView显示,给右侧留出按钮宽度+额外间距 if let rightView = rightView, !rightView.isHidden { // 8是额外的留白间距,你可以根据需求调整 textRect.size.width -= rightView.frame.width + 8 } return textRect } override func editingRect(forBounds bounds: CGRect) -> CGRect { // 编辑状态下rightView隐藏,直接使用默认的文本区域 return super.editingRect(forBounds: bounds) } }
之后把你的passwordTextField替换成这个自定义类的实例即可:
// 原创建passwordTextField的代码替换成 let passwordTextField = CustomPasswordTextField(frame: CGRect(x: ..., y: ..., width: 315, height: ...))
方法二:优化按钮布局,明确按钮尺寸和间距
如果你不想自定义子类,也可以直接在创建按钮时给它设置固定宽度和内边距,让UITextField能正确计算输入区域的范围:
func createForgetButton () { let button = UIButton(type: .system) button.setTitle("Vergessen?", for: .normal) button.addTarget(self, action: #selector(self.vergessenTapped(_:)), for: .touchUpInside) button.titleLabel?.font = UIFont(name: "Avenir Next", size: 19.0) // 禁用自动布局转换,手动设置按钮宽度 button.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ // 根据按钮文本长度调整宽度,这里设为100作为示例 button.widthAnchor.constraint(equalToConstant: 100) ]) // 给按钮添加左右内边距,让文本和按钮边缘、输入区域都有留白 button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 8) passwordTextField.rightView = button passwordTextField.rightViewMode = .unlessEditing }
这样按钮有了明确的宽度,UITextField会自动避开按钮的位置,输入文本就不会和按钮重叠了。
两种方法都能有效解决问题,自定义子类的方式更适合需要适配多种状态的场景,而调整按钮布局则更简单直接,你可以根据自己的需求选择~
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

