如何为UITextField的rightView添加间距并调整图片大小
直接修改rightView内部子控件的frame不会生效,因为UITextField在布局时会重写rightView的frame来适配自身边界,推荐以下两种实现方案:
方案1:容器View包裹实现(无需子类化,上手最快)
创建外层容器View承载图标,通过调整图标在容器内的位置实现间距效果,代码示例:
// 可自定义参数:右边距、图标尺寸 let rightPadding: CGFloat = 10 let imageSize = CGSize(width: 22, height: 22) // 创建容器,宽度 = 图标宽度 + 右边距,高度和文本框一致 let containerView = UIView(frame: CGRect(x: 0, y: 0, width: imageSize.width + rightPadding, height: self.frame.height)) // 图标垂直居中,x=0的情况下容器右侧自然留出间距 let imageView = UIImageView(frame: CGRect(x: 0, y: (containerView.frame.height - imageSize.height)/2, width: imageSize.width, height: imageSize.height)) imageView.image = UIImage(systemName: systemName) imageView.contentMode = .scaleAspectFit containerView.addSubview(imageView) self.rightView = containerView self.rightViewMode = .always
方案2:自定义UITextField子类(灵活度高,适合复用)
重写布局方法直接调整rightView和输入文字的边距,代码示例:
class CustomTextField: UITextField { // 输入文字的内边距,右边距需要大于等于rightView的总宽度 private let textInset = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 42) // rightView的水平偏移量,负数表示向左偏移 private let rightViewOffset: CGFloat = -10 // 调整非编辑状态下的文字区域 override func textRect(forBounds bounds: CGRect) -> CGRect { return bounds.inset(by: textInset) } // 调整编辑状态下的文字区域 override func editingRect(forBounds bounds: CGRect) -> CGRect { return bounds.inset(by: textInset) } // 直接调整rightView的显示位置 override func rightViewRect(forBounds bounds: CGRect) -> CGRect { let originalRect = super.rightViewRect(forBounds: bounds) return originalRect.offsetBy(dx: rightViewOffset, dy: 0) } }
内容的提问来源于stack exchange,提问作者Ivanius
相关产品推荐
相关产品推荐

