Ich habe mich gefragt, wie ich die Anzahl der LINES (nicht der in anderen Fragen gestellten Zeichen) begrenzen kann, die ein Benutzer beim Bearbeiten eines UITextField eingeben kann.
Idealerweise möchte ich die Eingabe auf max. 10 Zeilen.
Wo müsste ich anfangen? Mache ich das mit einer Methode? Im
- (BOOL)textViewShouldBeginEditing:(UITextView *)aTextView
iphone
cocoa-touch
uitextview
keine Ursache
quelle
quelle
Antworten:
Sie haben die richtige Idee, aber die falsche Methode.
textView:shouldChangeTextInRange:replacementText:
wird aufgerufen, wenn sich der Text ändern wird; Sie können über dietext
Eigenschaft auf den aktuellen Inhalt der Textansicht zugreifen und den neuen Inhalt aus dem übergebenen Bereich und dem Ersatztext mit erstellen[textView.text stringByReplacingCharactersInRange:range withString:replacementText]
. Sie können dann die Anzahl der Zeilen zählen und JA zurückgeben, damit die Änderung abgelehnt werden kann, oder NEIN, um sie abzulehnen.quelle
UITextView
es sich um eine Unterklasse von handeltUIScrollView
und diepagingEnabled
Eigenschaft auch.Die Antwort von Maciek Czarnik hat bei mir nicht funktioniert, aber sie hat mir Einblicke gegeben, was ich tun soll.
iOS 7+
Schnell
textView.textContainer.maximumNumberOfLines = 10 textView.textContainer.lineBreakMode = .byTruncatingTail
ObjC
textView.textContainer.maximumNumberOfLines = 10; textView.textContainer.lineBreakMode = NSLineBreakByTruncatingTail;
quelle
textView.textContainer.lineBreakMode = .ByTruncatingTail
Vielleicht kann dies helfen (iOS 7+):
textView.textContainer.maximumNumberOfLines = 10; [textView.layoutManager textContainerChangedGeometry:textView.textContainer];
Selbst die erste Zeile sollte den Trick machen, aber nicht ... Vielleicht ist es ein Fehler im SDK
quelle
Die Antwort von Maciek Czarnik scheint für mich selbst in iOS7 nicht zu funktionieren. Es gibt mir seltsames Verhalten, ich weiß nicht warum.
Was ich tue, um die Anzahl der Zeilen in der UITextView zu begrenzen, ist einfach:
(nur in iOS7 getestet) In der folgenden UITextViewDelegate-Methode:
- (void)textViewDidChange:(UITextView *)textView { NSUInteger maxNumberOfLines = 5; NSUInteger numLines = textView.contentSize.height/textView.font.lineHeight; if (numLines > maxNumberOfLines) { textView.text = [textView.text substringToIndex:textView.text.length - 1]; } }
quelle
in
Swift 3.0
Version:self.textView.textContainer.maximumNumberOfLines = self.textViewNumberOflines self.textView.textContainer.lineBreakMode = .byTruncatingTail
quelle
Hier ist eine verbesserte Version der Numereyes-Antwort in Swift 4.2 / Swift 5
Ich habe eine kleine Erweiterung vorgenommen, damit ich den Code wiederverwenden kann. Ich verwende eine While-Schleife, um zu überprüfen, ob die Größe passt. Dies funktioniert auch, wenn der Benutzer viel Text gleichzeitig einfügt.
extension UITextView { var numberOfCurrentlyDisplayedLines: Int { let size = systemLayoutSizeFitting(UIView.layoutFittingCompressedSize) //for Swift <=4.0, replace with next line: //let size = systemLayoutSizeFitting(UILayoutFittingCompressedSize) return Int(((size.height - layoutMargins.top - layoutMargins.bottom) / font!.lineHeight)) } /// Removes last characters until the given max. number of lines is reached func removeTextUntilSatisfying(maxNumberOfLines: Int) { while numberOfCurrentlyDisplayedLines > (maxNumberOfLines) { text = String(text.dropLast()) layoutIfNeeded() } } } // Use it in UITextView's delegate method: func textViewDidChange(_ textView: UITextView) { textView.removeTextUntilSatisfying(maxNumberOfLines: 10) }
quelle
Swift 4
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { let existingLines = textView.text.components(separatedBy: CharacterSet.newlines) let newLines = text.components(separatedBy: CharacterSet.newlines) let linesAfterChange = existingLines.count + newLines.count - 1 return linesAfterChange <= textView.textContainer.maximumNumberOfLines }
Und wenn Sie auch Zeichen einschränken möchten:
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { let existingLines = textView.text.components(separatedBy: CharacterSet.newlines) let newLines = text.components(separatedBy: CharacterSet.newlines) let linesAfterChange = existingLines.count + newLines.count - 1 if(text == "\n") { return linesAfterChange <= textView.textContainer.maximumNumberOfLines } let newText = (textView.text as NSString).replacingCharacters(in: range, with: text) let numberOfChars = newText.count return numberOfChars <= 30 // 30 characters limit } }
Vergessen Sie nicht, die Anzahl der Zeilen hinzuzufügen, in denen sich das Limit befinden soll
viewDidLoad
:txtView.textContainer.maximumNumberOfLines = 2
quelle
Die anderen angegebenen Lösungen lösen kein Problem im Zusammenhang mit einer letzten Zeile, die am Ende erstellt wird (eine elfte Zeile im Fall der Frage).
Hier ist eine funktionierende Lösung mit
Swift 4.0
& Xcode 9.0 Beta (in diesem Blog-Beitrag zu finden )class ViewController: UIViewController, UITextViewDelegate { @IBOutlet weak var textView: UITextView! override func viewDidLoad() { super.viewDidLoad() textView.delegate = self textView.textContainer.maximumNumberOfLines = 10 textView.textContainer.lineBreakMode = .byWordWrapping } func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { let existingLines = textView.text.components(separatedBy: CharacterSet.newlines) let newLines = text.components(separatedBy: CharacterSet.newlines) let linesAfterChange = existingLines.count + newLines.count - 1 return linesAfterChange <= textView.textContainer.maximumNumberOfLines }
Hinweis: Diese Lösung behandelt nicht das Szenario, in dem die letzte Zeile zu lang ist, um angezeigt zu werden (Text wird ganz rechts in der UITextView ausgeblendet).
quelle
Ähnlich wie bei anderen Antworten, jedoch direkt aus dem Storyboard und ohne Unterklassen verwendbar:
extension UITextView { @IBInspectable var maxNumberOfLines: NSInteger { set { textContainer.maximumNumberOfLines = maxNumberOfLines } get { return textContainer.maximumNumberOfLines } } @IBInspectable var lineBreakByTruncatingTail: Bool { set { if lineBreakByTruncatingTail { textContainer.lineBreakMode = .byTruncatingTail } } get { return textContainer.lineBreakMode == .byTruncatingTail } } }
quelle