这是一个简单的自定义textView,占位文字,字数限制
import UIKit
@objc protocol ADLimitTextDelegate {
@objc optional func textView(_ textView: ADLimitTextView, num: Int)
}
class ADLimitTextView: UIView {
//
var limitNums: Int = 100 /// 限制的字符
var limitDelegate: ADLimitTextDelegate?
var textFont: UIFont = .systemFont(ofSize: 16)
//限制次数
let numerRemindLabel: UILabel = {
let label = UILabel()
label.text = "0/50"
label.font = .systemFont(ofSize: 12)
label.textColor = UIColor(r: 195, g: 197, b: 202)
return label
}()
//文本框
let textView: UITextView = {
let textView = UITextView()
textView.font = .systemFont(ofSize: 16)
textView.backgroundColor = UIColor(r: 248, g: 248, b: 249)
textView.layer.cornerRadius = 2.5
textView.layer.masksToBounds = true
return textView
}()
//提示
let placeHolderLabel: UILabel = {
let label = UILabel()
label.textColor = UIColor(r: 195, g: 197, b: 202)
label.font = .systemFont(ofSize: 14)
label.numberOfLines = 0
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.addSubview(self.textView)
self.addSubview(self.placeHolderLabel)
self.addSubview(self.numerRemindLabel)
self.textView.delegate = self
self.textView.snp.makeConstraints { (make) in
make.edges.equalToSuperview()
}
self.placeHolderLabel.snp.makeConstraints { (make) in
make.left.equalToSuperview().offset(8)
make.right.equalToSuperview().offset(-10)
make.top.equalToSuperview().offset(12)
}
self.numerRemindLabel.snp.makeConstraints { (make) in
make.right.equalToSuperview().offset(-10)
make.bottom.equalToSuperview().offset(-5)
}
}
convenience init(limitNum: Int = 50, placeHolder: String = "请输入") {
self.init(frame: .zero)
limitNums = limitNum
placeHolderLabel.text = placeHolder
numerRemindLabel.text = "0/\(limitNum)"
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension ADLimitTextView: UITextViewDelegate{
func textViewDidChange(_ textView: UITextView) {
if textView.text.count > 0 {
self.placeHolderLabel.isHidden = true
} else {
self.placeHolderLabel.isHidden = false
}
if textView.text.count > self.limitNums {
if let str = textView.text {
//截取前面的字符
let subStr = str.prefix(self.limitNums)
textView.text = String(subStr)
}
}
self.numerRemindLabel.text = "\(textView.text.count)/\(self.limitNums)字"
if self.limitDelegate != nil {
self.limitDelegate!.textView?(self, num: self.limitNums)
}
}
}