When I wanted to make a twitter-like app, I wrote the code like textView.placeholder =" "
like textfield.
I got angry with Value of type'UITextView' has no member'placeholder'
.
Eh, there is no placeholder
for textView
...
So, let's somehow implement placeholder
in textView
.
This time, create a class
called TextView
that inherits the UITextView
and add a UILabel
to the TextView
.
TextView.swift
class TextView: UITextView {
public let placeholderLabel: UILabel = {
let label = UILabel()
label.textColor = .lightGray
label.font = .systemFont(ofSize: 18)
label.numberOfLines = 0
return label
}()
override init(frame: CGRect, textContainer: NSTextContainer?) {
super.init(frame: frame, textContainer: textContainer)
addSubview(placeholderLabel)
placeholderLabel.translatesAutoresizingMaskIntoConstraints = false
let cons = [
placeholderLabel.topAnchor.constraint(equalTo: topAnchor, constant: 8),
placeholderLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 5),
placeholderLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -5),
]
NSLayoutConstraint.activate(cons)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
I defined TextView like this.
All you have to do now is display textView
with ViewController
!
ViewController.swift
class ViewController: UIViewController {
let textView: TextView = {
let textView = TextView()
textView.placeholderLabel.text = "It's a placeholder"
textView.font = .systemFont(ofSize: 18)
return textView
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(textView)
textView.frame = .init(x: 0, y: 100, width: view.frame.size.width, height: view.frame.size.height-200)
}
}
This looks good!
However, if you leave it as it is, the characters you entered and the characters of placeholder Label
will overlap.
Well, as a result of thinking about what to do, I decided to use textViewDidChange (_ textView: UITextView)
of UITextViewDelegate
.
ViewController.swift
extension ViewController: UITextViewDelegate {
func textViewDidChange(_ textView: UITextView) {
if textView.text.isEmpty {
self.textView.placeholderLabel.alpha = 1
} else {
self.textView.placeholderLabel.alpha = 0
}
}
}
It's like this.
Show placeholderLabel
if textView.text
is empty, otherwise hide placeholderLabel
.
You have to write a lot of code just by implementing placehoder in textView lol Please let me know if there is an easier way to implement it!
Recommended Posts