在实际项目开发中经常有需要在UITextView中添加提示用户输入的一些文字,类似UITextField的Placeholder属性。
现在习惯了可视化编程,所以把自定义的视图定义为可视化模式
直接上代码
@IBDesignable
class FrankTextView: UITextView {
@IBInspectable
var placeholder: String? //可在 Interface Builder面板中自定义文字
@IBInspectable
var placeholderColor: UIColor = .clear //可在Interface Builder面板中自定义颜色
override func draw(_ rect: CGRect) {
let innerRect = CGRect(x: 5, y: 8, width:rect.width-10 , height:rect.height-16)
if let placeholder = placeholder as NSString? {
if let text = self.text {
if text.characters.count <= 0 {
placeholder.draw(in: innerRect, withAttributes: [.font:self.font ?? UIFont.systemFont(ofSize: 13), .foregroundColor:self.placeholderColor])
}
} else {
placeholder.draw(in: innerRect, withAttributes: [.font:self.font ?? UIFont.systemFont(ofSize: 13), .foregroundColor:self.placeholderColor])
}
}
}
override func awakeFromNib() {
super.awakeFromNib()
self.setNeedsDisplay()
NotificationCenter.default.addObserver(self, selector: #selector(updatePlaceholder(_:)), name: .UITextViewTextDidChange, object: nil)
}
@objc private func updatePlaceholder(_ sender: Notification) {
self.setNeedsDisplay()
}
deinit {
NotificationCenter.default.removeObserver(self, name: .UITextViewTextDidChange, object: nil)
}
}
2、通过 IBInspectable 和 IBDesignable标签我们可以把自定义的视图和属性显示在Interface Builder面板中,方便我们可视化编辑。
以上自定义视图效果如下:
这样是不是很方便,想了解IBInspectable 、IBDesignable标签的强大之处,请自行百度。