为UITextView添加placeholder

在实际项目开发中经常有需要在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面板中,方便我们可视化编辑。

以上自定义视图效果如下:

为UITextView添加placeholder_第1张图片
image.png

这样是不是很方便,想了解IBInspectable 、IBDesignable标签的强大之处,请自行百度。

你可能感兴趣的:(为UITextView添加placeholder)