Wie kann ich einen Platzhalter in einem UITextView
hinzufügen, ähnlich wie bei UITextField
, in Swift
?
Antworten
Zu viele Anzeigen?Swift 5.2
Standalone-Klasse
Verwenden Sie dies, wenn Sie eine Klasse möchten, die überall verwendet werden kann, da sie eigenständig ist
import UIKit
class PlaceHolderTextView:UITextView, UITextViewDelegate{
var placeholderText = "Platzhaltertext"
override func willMove(toSuperview newSuperview: UIView?) {
textColor = .lightText
delegate = self
}
func textViewDidBeginEditing(_ textView: UITextView) {
if textView.text == placeholderText{
placeholderText = textView.text
textView.text = ""
textView.textColor = .darkText
}
}
func textViewDidEndEditing(_ textView: UITextView) {
if textView.text == ""{
textView.text = placeholderText
textColor = .lightText
}
}
}
Der Schlüssel hier ist die Funktion willMove(toSuperView:)
, da sie es ermöglicht, die Ansicht einzurichten, bevor sie zur Hierarchie einer anderen Ansicht hinzugefügt wird (ähnlich wie viewDidLoad/viewWillAppear in ViewControllern)
Swift 3.1
Diese Erweiterung hat bei mir gut funktioniert: https://github.com/devxoul/UITextView-Placeholder
Hier ist ein Code-Schnipsel:
Installieren Sie es über pod:
pod 'UITextView+Placeholder', '~> 1.2'
Importieren Sie es in Ihre Klasse
import UITextView_Placeholder
Und fügen Sie die placeholder
-Eigenschaft zu Ihrem bereits erstellten UITextView
hinzu
textView.placeholder = "Geben Sie einige Details ein"
Das war's... So sieht es aus (Der dritte Kasten ist ein UITextView
)
SWIFTUI
Hier ist ein Swiftui TextView, der mit UIViewRepresentable erstellt wurde und über Funktionalität und Rahmenfarben verfügt
struct TextView: UIViewRepresentable {
@Binding var text: String
var placeholderText: String
var textStyle: UIFont.TextStyle
func makeUIView(context: Context) -> UITextView {
let textView = UITextView()
textView.font = UIFont.preferredFont(forTextStyle: textStyle)
textView.autocapitalizationType = .sentences
textView.isSelectable = true
textView.isUserInteractionEnabled = true
textView.delegate = context.coordinator
textView.layer.borderWidth = 0.6
textView.layer.borderColor = UIColor.lightGray.cgColor
textView.layer.cornerRadius = 10
textView.text = placeholderText
textView.textColor = UIColor.lightGray
return textView
}
func updateUIView(_ uiView: UITextView, context: Context) {
uiView.text = text
uiView.font = UIFont.preferredFont(forTextStyle: textStyle)
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, UITextViewDelegate {
var parent: TextView
init(_ parent: TextView) {
self.parent = parent
}
func textViewDidChange(_ textView: UITextView) {
self.parent.text = textView.text
}
func textViewDidBeginEditing(_ textView: UITextView) {
if textView.textColor == UIColor.lightGray {
textView.text = nil
textView.textColor = UIColor.black
}
}
func textViewDidEndEditing(_ textView: UITextView) {
if textView.text.isEmpty {
textView.text = self.parent.placeholderText
textView.textColor = UIColor.lightGray
}
}
}
}
dann in Ihrer Ansicht können Sie es so verwenden
TextView(text: self.$viewModel.addPostCommentText, placeholderText: "Teilen Sie Ihre Geschichte über dieses Bargeld mit", textStyle: .body)
.padding()
.frame(height: 150)
Keine Notwendigkeit, eine Drittbibliothek hinzuzufügen. Verwenden Sie einfach den folgenden Code...
class SubmitReviewVC : UIViewController, UITextViewDelegate {
@IBOutlet var txtMessage : UITextView!
var lblPlaceHolder : UILabel!
override func viewDidLoad() {
super.viewDidLoad()
txtMessage.delegate = self
lblPlaceHolder = UILabel()
lblPlaceHolder.text = "Nachricht eingeben..."
lblPlaceHolder.font = UIFont.systemFont(ofSize: txtMessage.font!.pointSize)
lblPlaceHolder.sizeToFit()
txtMessage.addSubview(lblPlaceHolder)
lblPlaceHolder.frame.origin = CGPoint(x: 5, y: (txtMessage.font?.pointSize)! / 2)
lblPlaceHolder.textColor = UIColor.lightGray
lblPlaceHolder.isHidden = !txtMessage.text.isEmpty
}
func textViewDidChange(_ textView: UITextView) {
lblPlaceHolder.isHidden = !textView.text.isEmpty
}
}
Swift - Ich habe eine Klasse geschrieben, die UITextView erbt, und ich habe ein UILabel als Subview hinzugefügt, um als Placeholder zu fungieren.
import UIKit
@IBDesignable
class HintedTextView: UITextView {
@IBInspectable var hintText: String = "hintText" {
didSet{
hintLabel.text = hintText
}
}
private lazy var hintLabel: UILabel = {
let label = UILabel()
label.font = UIFont.systemFontOfSize(16)
label.textColor = UIColor.lightGrayColor()
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
override init(frame: CGRect, textContainer: NSTextContainer?) {
super.init(frame: frame, textContainer: textContainer)
setupView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupView()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
setupView()
}
private func setupView() {
translatesAutoresizingMaskIntoConstraints = false
delegate = self
font = UIFont.systemFontOfSize(16)
addSubview(hintLabel)
NSLayoutConstraint.activateConstraints([
hintLabel.leftAnchor.constraintEqualToAnchor(leftAnchor, constant: 4),
hintLabel.rightAnchor.constraintEqualToAnchor(rightAnchor, constant: 8),
hintLabel.topAnchor.constraintEqualToAnchor(topAnchor, constant: 4),
hintLabel.heightAnchor.constraintEqualToConstant(30)
])
}
override func layoutSubviews() {
super.layoutSubviews()
setupView()
}
}