2010-03-13 5 views
5

Desidero conoscere la larghezza di una NSString visualizzata sullo schermo in pixel. Quindi posso adattare un NSTextField ai suoi limiti per essere esattamente la lunghezza della stringa stessa. Così ho usato IB "Label" NSTextField e per coloro che non sanno cosa intendo, ho ottenuto un'etichetta con il titolo "Label", font "Lucida Grande 13px", non selezionabile, non modificabile, dimensioni regolari, senza sfondo e secondo a IB la sua larghezza è 38 px di larghezza.Dimensione NSStringWithAttributes: imprecisione

Se voglio ottenere la sua larghezza programatically Io uso

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

che mi darà 33,293,457 mila. Quindi questo è circa 5 px della larghezza reale ..

risposta

0

In realtà sembra ragionevole. Stai confrontando due diverse larghezze; la larghezza di una stringa non elaborata rispetto alla larghezza di una stringa contenuta in un campo NSText. La stringa contenuta probabilmente ha solo un filino di imbottitura su entrambe le estremità, tra le altre differenze minori.

+0

Potrebbe essere, ma l'altezza è corretta con 6 cifre dopo la virgola ... Dopo aver eseguito alcuni test sembra che il risultato sia sempre ~ 5 px più piccolo dell'originale .. Ecco perché sospetto che qualcosa non funzioni con gli attributi e non so cosa. Anche passando il colore corretto, lo stile di sfondo, lo stile di paragrafo, la modalità di interruzione di riga e la direzione mi danno gli stessi risultati di ~ 5 px più piccoli. – Jef

7

Credo che ciò che si nota sia la differenza tra il frame del controllo e il suo frame di layout. Vedi Frame vs Layout Frame per una buona spiegazione.

Stai facendo la cosa giusta nel calcolo della larghezza. Per un'etichetta, non vi è alcun riempimento aggiuntivo nella parte superiore o inferiore del controllo, motivo per cui non si sono verificati problemi con l'altezza del controllo. Tuttavia, a sinistra ea destra del controllo, ci sono altri tre pixel. Questo può essere verificato guardando il Frame e il Layout di un controllo Label in IB.

Quindi, i ~ 5 pixel che hai notato sono in realtà esattamente 6. Una volta preso in considerazione questo riempimento, non dovresti avere ulteriori problemi.

Sfortunatamente, non ci sono API per determinare quale padding è per i vari controlli (i Pulsanti hanno 6 pixel aggiuntivi su ciascun lato). Suggerirei di presentare una segnalazione di bug a http://bugreport.apple.com - Apple basa le API che forniscono in parte sul numero di richieste per loro. Mentre IB ti dirà, dovrai codificare questi valori tu stesso. Se cambiano nella prossima versione del SO, sarà necessario aggiornare la tua applicazione.