Custom textView with clear button:
final class ClearableTextView: UITextView {
private lazy var clearButton: UIButton = {
let button = UIButton()
button.setImage(UIImage(systemName: "clear.fill"), for: .normal)
button.setTitle(nil, for: .normal)
button.tintColor = .gray
addSubview(button)
return button
} ()
let clearButtonSize: CGFloat = 30
let clearButtonRightInset: CGFloat = 4
override var bounds: CGRect {
didSet {
clearButton.frame = CGRect(
x: bounds.maxX - clearButtonSize - clearButtonRightInset,
y: bounds.midY - clearButtonSize / 2,
width: clearButtonSize,
height: clearButtonSize
)
}
}
public override init(frame: CGRect, textContainer: NSTextContainer?) {
super.init(frame: frame, textContainer: textContainer)
setup()
}
public required init?(coder: NSCoder) {
super .init(coder: coder)
setup()
}
private func setup() {
clearButton.addTarget(self, action: #selector(onClearClick), for: .touchUpInside)
textContainerInset.right = clearButtonSize + clearButtonRightInset
}
@objc private func onClearClick() {
text = nil
delegate?.textViewDidChange?(self)
}
}