2010-03-13 5 views
5

Ich möchte die Breite eines NSString auf dem Bildschirm in Pixel angezeigt wissen. Daher kann ich ein NSTextField so anpassen, dass es exakt der Länge der Zeichenfolge entspricht. Also habe ich IBs "Label" NSTextField verwendet und für diejenigen, die nicht wissen, was ich meine, habe ich ein Label mit dem Titel "Label", Schriftart "Lucida Grande 13px", nicht auswählbar, nicht editierbar, normale Größe, kein Hintergrund und entsprechend zu IB ist seine Breite 38px breit.NSString sizeWithAttributes: Ungenauigkeit

Wenn ich will, seine Breite Ich benutze

[@"Label" sizeWithAttributes: [NSDictionary dictionaryWithObject: [NSFont fontWithName: @"Lucida Grande" size: 13] forKey: NSFontAttributeName]].width 

programmatisch erhalten, die mir 33,293457 geben. Das sind also etwa 5 px der realen Breite.

Antwort

0

Das klingt eigentlich vernünftig. Sie vergleichen zwei verschiedene Breiten; die Breite einer Raw-Zeichenfolge im Vergleich zur Breite einer Zeichenfolge, die in einem NSTextField enthalten ist. Die enthaltene Zeichenfolge hat wahrscheinlich nur ein kleines bisschen Polsterung an jedem Ende, neben anderen geringfügigen Unterschieden.

+0

Könnte sein, aber die Höhe ist korrekt mit 6 Ziffern nach dem Komma ... Nach einigen Tests sieht es so aus, dass es immer ~ 5 px kleiner als das Original ist. Deshalb vermute ich, dass etwas mit den Attributen nicht stimmt und ich weiß nicht was. Sogar die korrekte Farbe, den Hintergrundstil, den Absatzstil, den Zeilenumbruchmodus und die Richtung zu übergeben, gibt mir die gleichen Ergebnisse von ~ 5 px kleiner. – Jef

7

Ich glaube, was Sie bemerken, ist der Unterschied zwischen dem Rahmen des Steuerelements und dem Layout-Rahmen. Eine gute Erklärung finden Sie unter Frame vs Layout Frame.

Sie tun das Richtige bei der Berechnung der Breite. Für ein Label gibt es am oberen oder unteren Rand des Steuerelements keine zusätzliche Polsterung, weshalb Sie keine Probleme mit der Höhe Ihres Steuerelements feststellen konnten. Links und rechts neben dem Steuerelement befinden sich jedoch drei zusätzliche Pixel. Dies kann überprüft werden, indem Sie das Steuerelement Rahmen und Layout eines Labels in IB betrachten.

So, die ~ 5 Pixel, die Sie bemerkt haben, ist eigentlich genau 6. Sobald Sie diese Polsterung berücksichtigen, sollten Sie keine weiteren Probleme haben.

Leider gibt es keine API, um zu bestimmen, was die Auffüllung für verschiedene Steuerelemente ist (Push Buttons haben zusätzliche 6 Pixel auf jeder Seite). Ich würde vorschlagen, einen Fehlerbericht unter http://bugreport.apple.com einzureichen - Apple basiert auf den von ihnen bereitgestellten APIs teilweise auf der Anzahl der Anfragen für sie. Während IB Ihnen sagen wird, müssen Sie diese Werte selbst codieren. Wenn sie sich in der nächsten Betriebssystemversion ändern, müssen Sie Ihre Anwendung aktualisieren.