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:
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:
Wie Sie im zweiten Beispiel (mit weit längerem Text) sehen können, gibt es eine Reihe von Problemen:
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!
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.