Länge der Zeichenfolge mit der angegebenen schriftart zu passen UITextView
Muss ich verschieben text, den der Benutzer eingegeben hat, in einer großen multi-line UITextView
in eine kleinere (aber immer noch multi-line) UITextView
*. Wenn der Benutzer eingegeben hat mehr text als Anzeige in der kleineren Ansicht, ich möchte kürzen Sie den text so, dass es passt mit alle die (gekürzte) text sichtbar. (Weder die große UITextView
noch das kleinere scrollen soll.)
Was ist der beste Weg, dies zu tun?
Kann ich eine Schleife verwenden, die Verkürzung der string durch ein Zeichen jeder Zeit, und verwenden Sie dann NSString
's sizeWithFont: constrainedToSize: lineBreakMode:
um herauszufinden, die Höhe dieser kürzere Zeichenfolge benötigen würden, und dann vergleichen Sie das mit der Höhe habe ich in meinem kleineren UITextView
endet die Schleife, wenn der string passt - aber das scheint langsam und umständlich. Es muss einen besseren Weg geben.
Möchte ich nur sagen, das Ziel UITextView
abschneiden seiner Anzeigetext Mitglied, wie es zeigt Sie auf dem Bildschirm, aber ich habe nicht in der Lage gewesen, einen Weg zu finden, das zu tun.
*Mehr Kontext auf diese, aus einem Kommentar, den ich gemacht unter:
Habe ich eine Landschaft, app. Ich ändere das layout der anzeigen, je nach dem Foto, das der Benutzer auswählt. Wenn es eine Landschaft Foto, die Bildunterschrift ist kleiner - nur in einer Zeile am unteren Rand des Fotos. Wenn Sie wählt ein portrait-Foto, dann es ist genug Platz ich kann für Sie die Beschriftung an der Seite des Fotos, also die Beschriftung ist größer.
Wenn der Benutzer änderungen an Ihr Foto, das die Orientierung von hochformat auf Querformat, dann will ich kürzen Sie den text, und dann erlauben Sie Ihr, um es zu Bearbeiten, so dass es Sinn macht. Ich konnte nur zappen, aber ich würde es vorziehen, um es zu erhalten, zu minimieren Ihre Eingabe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schrieb ich folgende rekursive Methode und öffentlichen API, um dies richtig tun. Das hässliche fudge-Faktor ist das Thema diese Frage.
Dies nicht wirklich eine Lösung, aber es bietet eine gute Ausgangsposition poing für die Berechnung.
Wenn Sie NSString ist
sizeWithFont: constrainedToSize: lineBreakMode:
erhalten Sie eine vertikale Höhe für Ihren text. Wenn Sie teilen, dass Sie durch Ihre schriftart führenden Höhe, erhalten Sie die Anzahl der Zeilen in der gesamten Zeichenfolge. Teilung [NSString count] durch diese Zahl gibt Ihnen eine Annäherung an die Anzahl der Zeichen pro Zeile. Dies setzt Voraus, der string ist homogeneuous und wird ungenau sein, wenn jemand (z.B.) 'iiiiiiiiiii..." als oposed zu "MMMMMMMMM...".Können Sie auch teilen Sie die bounding box, indem Sie die entsprechende schriftart
leading
Höhe, um die Anzahl der Zeilen, die passen in Ihrer bounding box.Multiplikation Zeichen pro Zeile Anzahl der Zeilen gibt Ihnen einen Ausgangspunkt für die Suche nach text, der passt.
Ihnen rechnen konnte, ist der Spielraum für Fehler in diesem Bild, indem Sie die gleiche Berechnung für diejenigen "iiiiii..." und "MMMMMM...'" strings.
Ich würde vorschlagen, nehmen einen etwas anderen Ansatz und sehen, wenn Sie können, verwenden Sie ein UILabel statt der kleineren UITextView.
UILabels kann so eingerichtet werden, dass multi-line wie ein UITextView durch Ihre numberOfLines Eigenschaft.
UILabels haben auch eine lineBreakMode Eigenschaft und ich glaube, dass der Standardwert der Eigenschaft wird die genaue abschneiden der Wirkung, die Sie suchen.
Ich denke, dass Jonathan war auf etwas über die UILabel...
So, der Benutzer beendet die Bearbeitung der UITextView, bekommen Sie die Zeichenfolge und übergeben es an die UILabel. Ändern Sie die alpha der UITextView auf 0 und/oder entfernen Sie es von superview. Möglicherweise speichern Sie die untruncated vollständigen text in einem ivar.
UILabels nicht "bearbeitbar", aber Sie können erkennen, eine Berührung mit einem UILabel (oder es ist superview).
Wenn Sie feststellen, dass der touch auf das UILabel, Sie einfach wieder die versteckten UITextView und wiederherstellen von die Zeichenfolge, die Sie gespeichert.
Manchmal das SDK ist ein Schmerz, aber es ist fast immer gewinnt er den Kampf. Viele Male, ist es besser zu passen Ihr design an UIKit Konventionen