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.
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
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
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