Text skalieren, um auf das iPhone zu passen

8

Ich habe ein paar Probleme damit, den "besten" Weg auszuarbeiten, um Text in meiner Anwendung zu rendern.

Meine Hauptansicht besteht aus einer Textansicht und das Design der Anwendung diktiert einige Dinge:

  • Die (Schrift-) Größe des Textes sollte dynamisch sein
  • Der Textrahmen sollte vertikal in der Ansicht zentriert sein
  • Die Silbentrennung sollte automatisch und nur bei Bedarf (möglichst vermieden) erfolgen

Im Moment benutze ich ein UILabel und den folgenden Code, um zu versuchen, die beste Schriftgröße für die Textmenge zu erraten:

%Vor%

Und:

%Vor%

Dies funktioniert bis zu einem gewissen Grad, fällt aber oft um, wenn der Text ein bisschen auf der langen Seite ist. Diese beiden Beispiele zeigen, dass es die folgenden Strings rendert:

  • "kurze Textmenge"
  • "eine wesentlich größere Menge an Text, den ich noch gut darstellen möchte."

Wie Sie im zweiten Beispiel (mit weit längerem Text) sehen können, gibt es eine Reihe von Problemen:

  • Die anfängliche Witwe
  • Das abgelegte y
  • Das fehlende "nett".

Mit all dem im Hinterkopf, was sind meine Möglichkeiten? Ich bin offen für den Einsatz von Cortex, wenn dies die richtige Lösung ist, aber ich habe keine Ahnung, wo ich anfangen soll. Es ist auch möglich, dass ich einen Fehler gemacht habe kann einfach nicht in meinem "Font Size Guessing" -Code sehen.

Jede Eingabe, die Sie anbieten könnten, würde dankbar empfangen.

Vielen Dank!

    
craig t mackenzie 16.11.2010, 22:28
quelle

3 Antworten

3

Die folgende Methode wird voll verwendet, um die Schriftgröße für eine bestimmte Zeichenfolge für ein bestimmtes Rechteck (Bereich) zu erhalten.

%Vor%

Verwenden Sie dies und erhalten Sie die Schriftgröße und zuweisen Sie die Bezeichnung.

Grüße,

Satya.

    
Satya 02.12.2010 10:34
quelle
2

Eine Sache, die ich nützlich finde, ist eine kleine Funktion, die einen NSString, einen UIFont und einen CGSize übernimmt und einen CGFloat zurückgibt, der die größte Schriftgröße für den String darstellt, der in den übergebenen CGSize passt - er verwendet sizeWithFont nacheinander kleinere Punktgrößen, bis die zurückgegebene Größe in das CGSize-Argument passt. Sie können CGFLOAT_MAX entweder als x oder y übergeben, wenn Sie sich nicht um eine Dimension kümmern, z. B. wenn Sie die Breite einer Linie überprüfen und später die Höhe der ganzen Linie überprüfen. Sie definieren natürlich die maximale und minimale Schriftgröße.

Ich würde damit beginnen, die Zeichenfolge in ein Array von Wörtern unter Verwendung von componentsSeparatedByString zu trennen. Möglicherweise möchten Sie ein Wort definieren, das als ein Wort, das ein Vielfaches des nächstgrößeren Wortes ist, getrennt wird, wenn alle Wörter mit derselben Schriftgröße gerendert werden. Sie erstellen dieses Array für eine beliebige Schriftgröße, und Sie haben ein übereinstimmendes Array von relativen Breiten (oder vielleicht ein Wörterbuch, wo das Wort der Schlüssel und die Breite der Wert ist). Sie müssen nach solchen Wörtern suchen und sie in zwei Wörter trennen (eines mit Bindestrich), bevor Sie fortfahren. Als nächstes müssen Sie die Schriftgröße finden, bei der alle Wörter in Ihre Größenbeschränkung passen, in dem Beispiel, das Sie gezeigt haben, dass es sich um Breite handelt, indem Sie die oben genannte Funktion verwenden.

Wenn die gewünschte Schriftgröße bekannt ist, überprüfen Sie Ihre anderen Einschränkungen wie Witwen - wahrscheinlich definieren Sie diese in Bezug auf die Positionen, die sie möglicherweise nicht einnehmen (der Anfang für eine) und das Verhältnis der Linienbreite, die eine Witwe macht. Wenn Sie ein Problem finden, kombinieren Sie Wörter im Array, um die Witwe zu entfernen und eine neue Schriftgröße zu berechnen. Dies könnte dazu führen, dass Sie in der ersten Zeile eine Silbentrennung oder eine kleinere Schrift erhalten, aber wenn Ihr Text "unverhältnismäßig" ist langer Anfang zu einer Gruppe von kleinen Worten "dann haben Sie vielleicht keine Wahl.

Das Problem des "schönen" Verschwindens ist nicht so schwer, Sie müssen nur die Höhe des gerenderten Textes überprüfen - wahrscheinlich könnten Sie sizeWithFont:constrainedToSize verwenden, nachdem Sie die oben genannten Prozeduren als letzte Prüfung abgeschlossen haben. Wenn dies fehlschlägt, reduzieren Sie die maximale Zeichensatzgröße und beginnen Sie erneut.

Also:

%Vor%

Es ist nur ein Anfang, aber es sollte von dort funktionieren.

    
Adam Eberbach 17.11.2010 00:33
quelle
0
%Vor%     
rajesh 23.11.2010 07:18
quelle