2016-12-21 6 views
0

Ich habe diese editierbare Textansicht in einer Tabellenansichtszelle, maximumNumberOfLines ist auf 4 und lineBreakMode auf byClipping eingestellt. Das funktioniert so ziemlich wie vorgesehen, aber es scheint, dass Sie über die Breite des Textansicht eingeben können, etwa so:Erkennungszeichen nicht sichtbar in der Textansicht

Infinite typing

Obwohl die Zeichen nicht sichtbar sind sie irgendwo gespeichert werden, weil zu erhalten, um Zurück zum sichtbaren Text, löschen Sie so viel wie Sie außerhalb der Grenzen eingegeben haben.

Ich habe Mühe, etwas Einzigartiges über diese unsichtbaren Zeichen zu finden, so dass eine einfache deleteBackward() den Job innerhalb einer if-Anweisung erledigt. Auf diese Weise kann der Benutzer die Grenzen der Textansicht nicht manuell eingeben.

Was ist mit diesen unsichtbaren Zeichen, die ich identifizieren kann in textView:shouldChangeTextIn, so dass ich deleteBackwards() und den Typ ungültig?

+0

Versuchen Sie, die Lösung Umwandlung hier swift posted: http://stackoverflow.com/questions/21889657/uitextviews-text-going-beyond-bounds – AnthonyW

Antwort

0

Dieses in Ihrem UITextViewDelegate:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { 
    if text.isEmpty { // Always allow backspace 
     return true 
    } 
     let numLines: Int = Int(textView.contentSize.height/textView.font!.lineHeight); 
     return numLines <= 4 
    } 

wäre am besten, dass 4 für eine schöne Konstante oder etwas fest einprogrammiert zu tauschen.

Hinweis: Dies kann 1 zusätzliches Zeichen in der "fünften" Zeile zulassen. Um dies zu vermeiden, müssten Sie zusätzlichen Code hinzufügen, um die Größe des Inhalts vorherzusehen und dementsprechend zu reagieren.

+0

Danke, aber das ist eigentlich nicht wonach ich gesucht habe. Es gab kein Problem mit der maximalen Anzahl von Zeilen, da die 'maximumNumberOfLines' Konstante der Tabellenansicht früher gesetzt wurde und funktionierte. Das Problem lag in einem Überlauf von Text in horizontaler Richtung, nicht in der Vertikalen. – rodrigochousal

+0

Ich habe einige Tests gemacht und andere Lösungen auf SO untersucht. Dadurch werden die zusätzlichen Zeichen auf 1 beschränkt. Bei anderen Lösungen können Sie weiter vom Bildschirm tippen. Wenn die Implementierung von 'UITextView' nicht ausgeblendet wäre, wäre es viel einfacher zu lösen. – AnthonyW

0

Ich fand die caretRect Breite für die Textansicht, wenn Text übergelaufen war etwas breiter als alle anderen vorherigen Zeilen, wenn Text übergelaufen ist. Dies war ungleich contentSize und textView.frame.size, die sich nicht änderten, wenn Buchstaben übergelaufen sind. Dadurch konnte ich den Überlauf erkennen und das betreffende Zeichen löschen. Hier ist die vollständige Umsetzung:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { 

    let textRect = textView.caretRect(for: textView.endOfDocument) 

    //Maximum length of a character is about 10 
    if textView.contentSize.width - textRect.maxX < 10 { 

     // If user is already deleting, don't delete twice 
     if text != "" { 
      textView.deleteBackward() // return false works too 
     } 
    } 

    return true 
} 
Verwandte Themen