NSString boundingRectWithSize Unterschätzen leicht die richtige Breite - warum?

8

Ich erstelle eine Klasse, die ein Fenster mit etwas Text, einem "Nicht mehr anzeigen" -Kontrollkästchen und einer Schaltfläche anzeigt. Um wiederverwendbar zu sein, passt die Klasse das Fenster an, um den Text anzupassen.

Allerdings gibt es eine kleine Ungenauigkeit in den Berechnungen - wenn ich der Breite nicht 5 Pixel hinzufüge, werden einige Strings abgeschnitten. (Das letzte Wort wird einfach entfernt.)

Folgendes habe ich:

%Vor%

Ich habe die Hintergrundfarbe des Labels vorübergehend auf Gelb gesetzt, um das Debuggen zu vereinfachen, und es wird deutlich erweitert, bis fast für das letzte Wort passt. 4 Pixel extra ist genug für diese Test-String Beachten Sie, dass nicht alle Strings ohne diese zusätzlichen Pixel fehlschlagen.

Es gibt zwei Gründe, die mich interessieren:
1) Ich möchte lernen, warum es etwas falsch ist, und vor allem
2) Ich stelle fest, dass sich die Umhüllung theoretisch ändern kann, wenn man die Breite nach der Berechnung ändert, und die ansonsten letzte Zeile unbenutzt lässt, wodurch zusätzlicher leerer Raum unter dem Text erzeugt wird.

    
exscape 01.04.2011, 10:46
quelle

3 Antworten

1

Ich habe das gleiche Problem ein paar Mal in den letzten paar Jahren erlebt, wenn ich die Methode anwenden muss. Ich habe nie eine Information über die Angelegenheit gefunden, aber was ich über die Jahre gesammelt habe, ist, dass das Problem scheint, dass je kürzer die Saite ist, desto ungenauer die Breite wird. Nach einer ausreichend langen Länge ist die Gleichung, die sie verwenden, nahezu perfekt, aber davor ist es schrecklich. Warum das ist, habe ich nie eine Erklärung dafür gefunden.

Bei meinen Versuchen, das Problem zu umgehen, habe ich versucht, flache Werte zu addieren und mit Konstanten zu multiplizieren, aber diese haben niemals perfekte Ergebnisse geliefert.

In letzter Zeit benutze ich

%Vor%

mit NSStringDrawingUsesDeviceMetrics. Dies hat mir annehmbare Ergebnisse für Längen gegeben, die ich häufig verwende. Ich habe eine maximale Varianz von 1-2 Pixeln für Strings zwischen 8-50 Zeichen gesehen, was genau genug für meine Anforderungen ist. Nach 50 Zeichen ist boundingRectWithSize: options: attributes: viel genauer aber nicht perfekt. Ich habe es nicht umfassend genug getestet, um mehr zu sagen. Das sollte jedoch keine Sorgen mehr machen, eine weitere Zeile darunter zu haben, da der Text niemals auf eine andere Zeile fallen sollte. In den höheren Bereichen (nicht mehr als 300 Zeichen getestet) wird es etwas überschätzen statt zu unterschätzen. Für den Fall, dass es erneut zu unterschätzen beginnt, erhöhen Sie die 25 auf ~ 30.

    
Aeorred 19.04.2011 20:16
quelle
1

Wickeln Sie das Ergebnis mit ceilf (), so dass der Wert auf die nächste ganze Zahl aufgerundet wird. Das macht einen großen Unterschied.

    
Brennan 10.10.2013 23:02
quelle
0

Ich habe das NSTextFieldCell über die Methode cellSizeForBounds: abgefragt, um genauer zu sein als mit boundingRectWithSize: um die Texthöhe bei einer festen Breite zu bestimmen. Sie können feststellen, dass es in Ihrem Fall allgemeiner für die Schätzung der Breite funktioniert. (Ich verwende Mountain Lion, daher bin ich mir nicht sicher, wie es mit früheren SDKs weitergeht.)

Siehe meine Antwort auf diese Frage bezüglich der Schätzung der Texthöhe .

    
user2067021 07.11.2012 01:39
quelle

Tags und Links