2016-06-10 10 views
1

Ist es möglich, eine UILabel-Unterklasse zu erstellen, die ihren Text automatisch aktualisiert, je nachdem, ob genügend Platz vorhanden ist oder nicht? Ähnlich wie die Beschriftung Ellipsen hinzufügen kann.Aktualisiert UILabel Text basierend auf Komprimierung

Ich möchte zwei Eigenschaften erstellen preferredText und alternateText und die Bezeichnung automatisch zwischen den beiden basierend auf der Menge an verfügbaren Speicherplatz auswählen. Also könnte ich etwas wie preferredText = @"Count text: 1024"; alternateText = @"1024"; machen.

Ich habe natürlich intrinsicContentSize betrachtet, aber ich denke, dass sollte immer einen Wert basierend auf preferredText zurückgeben. Ich schaute auch auf überschreiben systemLayoutSizeFittingSize und systemLayoutSizeFittingSize:..., aber diese Methoden werden nie während des automatischen Layouts aufgerufen. Ich habe auch versucht, layoutSubviews zu überschreiben, aber an diesem Punkt hat das System bereits entschieden, wie groß es das Etikett sein will. Wenn Sie den Text dort ändern, kann dies zu einer Endlosschleife führen.

Idealerweise hätte ich gerne eine verallgemeinerte Lösung, die ich auch auf andere Ansichtsarten anwenden könnte. Ein benutzerdefinierter uibutton könnte beispielsweise ein anderes Bild auswählen, wenn nicht genügend Speicherplatz vorhanden ist.

Antwort

0

Sie müssten sich den bevorzugten Text und die Größe des Etiketts ansehen und dann die erforderliche Größe für den Text ansehen (leicht gemacht mit boundingRectWithSize...) und sehen, ob es passt. Abhängig davon, was Sie lernen, würden Sie dann den bevorzugten Text oder den alternativen Text zuweisen.

(Es wäre jedoch besser, das Label zu skalieren, abhängig von seinem Text, was es sowieso automatisch machen möchte. Oder Sie könnten die Tatsache nutzen, dass ein Label es gerne schrumpfen lässt Schriftgröße, wenn das ist, was es braucht, um den Text passend zu machen.)

+0

Danke Matt. Ich verstehe, wie man die Größe eines Etiketts berechnet. Die Frage ist, welche Methode oder welche Methoden am besten überschrieben werden sollten, damit a) das System weiß, dass es das Etikett kleiner machen kann, und b) den Text ersetzt, sobald die Größe festgelegt wurde. Die Antwort auf ein. scheint 'systemLayoutSizeFittingSize: ...' zu sein und gibt die Größe für 'alternateText' zurück, wenn' preferedText' nicht passt, aber diese Methode wird niemals während des Layouts aufgerufen. Für b. Würde es wie 'layoutSubviews' aussehen, aber wie ich erwähnt habe, kann dies zu einer Endlosschleife führen, wenn Sie den Text dort ändern. – arsenius

+0

Ich verstehe das Problem nicht ganz. Wenn die Größe des Etiketts nicht von seinem Inhalt abhängen soll, muss es von etwas anderem abhängen, vermutlich externen Beschränkungen. Die Größe ist also absolut bekannt, und jetzt wissen Sie, welchen Text Sie einfügen möchten (was die Größe nicht ändert). Oder, wenn das automatische Layout Ihnen Probleme bereitet, nehmen Sie das Etikett aus der Kontrolle des automatischen Layouts heraus. - Die einfachste Lösung ist jedoch, UILabel nicht zu verwenden. Es ist einfach, eine UIView zu erstellen, die eine Zeichenkette zeichnet, und jetzt haben Sie die volle Kontrolle (während UILabel, wie Sie entdeckt haben, einige Layout-Tricks ausführt). – matt

+0

Das Problem ist ähnlich wie Apple Ellipsen hinzufügt oder die Schriftart verkleinert, wenn der Text zu lang ist. Anstelle von Ellipsen würde ich einfach den gesamten Text ersetzen. Ich dachte daran, vielleicht mit zwei Etiketten etwas zu sehen. 'preferred' würde einen niedrigen horizontalen Kompressionswiderstand haben und' alternate' würde einen hohen Widerstand haben. Dann könnte ich jeden von ihnen an die Kanten per Autolayout anheften. Während 'layoutSubviews' würde ich basierend auf dem tatsächlichen Rahmen entsprechend ausblenden/anzeigen. Ich hatte gehofft, UILabel direkt zu untergliedern. – arsenius