2011-02-17 11 views
6

Esiste un metodo equivalente in AppKit (per Cocoa su Mac OS X) che fa la stessa cosa di UIKit [NSString sizeWithFont:constrainedToSize:]?UIKit's [NSString sizeWithFont: constrainedToSize:] in AppKit

In caso contrario, come posso ottenere la quantità di spazio necessaria per eseguire il rendering di una stringa particolare vincolata a una larghezza/altezza?

Aggiornamento: di seguito è riportato uno snippet di codice che sto utilizzando che mi aspetto avrebbe prodotto i risultati che sto cercando.

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSFont systemFontOfSize: [NSFont smallSystemFontSize]], NSFontAttributeName, 
          [NSParagraphStyle defaultParagraphStyle], NSParagraphStyleAttributeName, 
          nil]; 
NSSize size = NSMakeSize(200.0, MAXFLOAT); 
NSRect bounds; 

bounds = [@"This is a really really really really really really really long string that won't fit on one line" 
      boundingRectWithSize: size 
      options: NSStringDrawingUsesFontLeading 
      attributes: attributes]; 

NSLog(@"height: %02f, width: %02f", bounds.size.height, bounds.size.width); 

mi aspetterei che la larghezza di uscita sarebbe 200 e l'altezza sarebbe qualcosa di più grande di l'altezza di una singola linea, ma produce:

height: 14.000000, width: 466.619141 

Grazie!

+1

duplicato: http://stackoverflow.com/questions/ 2349692/cosa-il-equivalente-sizewithfont-metodo-per-il-mac. Qualcuno non cerca in questi giorni? –

+3

Ho cercato ma, incredibilmente, non l'ho trovato. Indipendentemente da sizeWithAttributes: non supporta, afaik, limitando la larghezza. –

+4

Questo non è un duplicato a causa dell'elemento vincolo, che manca a quell'altra domanda. –

risposta

1

MODIFICA: Dovresti essere in grado di fare le cose nel modo normale in Lion e in seguito. I problemi descritti di seguito sono stati risolti.


Non esiste alcun modo per misurare con precisione il testo tra le attuali API di Mac OS X.

Esistono diverse API che promettono di funzionare ma non lo fanno. Questo è uno di loro; Core Text's function for this purpose è un altro. Alcuni metodi restituiscono risultati che sono vicini ma sbagliati; alcuni restituiscono risultati che sembrano non significare nulla. Non ho ancora segnalato bug su questi, ma quando lo farò, modifico i numeri del Radar in questa risposta. Dovresti anche inserire un bug e includere il tuo codice in un piccolo progetto di esempio.

[Apparentemente ho già archiviato il testo principale: 8666756. È chiuso come duplicato di un altro errore non specificato. Per Cacao, ho presentato 9.022.238 sul metodo Dave ha suggerito, e archiverò due insetti NSLayoutManager domani.]

This is the closest solution I've found.

+0

Il tuo link è rotto. – livingtech

+0

@livingtech: ho aggiornato la mia risposta. Grazie. –

+0

@PeterHosey Hai detto che funziona su Lion ma non sembra per me .. ecco la mia domanda .. http://stackoverflow.com/questions/11766189/how-do-we-measure-visible-bounds-of -text-in-cocoa e una domanda correlata è su http://stackoverflow.com/questions/11877791/what-does-the-nsstringdrawingusesdevicemetrics-flag-mean-and-how-do-we-use-it/ – trss

-4

Se si ricerca la documentazione per NSString, si troverà il "Riferimento di aggiunta del kit di applicazioni NSString", che è praticamente analogo alla controparte UIKit.

-[NSString sizeWithAttributes:] 

è il metodo che stai cercando.

+1

C'è un attributo che dice a sizeWithAttributes: per limitare la sua larghezza/altezza? –

1

Se si desidera vincolare la stringa a una determinata dimensione, si utilizza -[NSString boundingRectWithSize:options:attributes:]. Lo .size restituito NSRect è la dimensione che stai cercando.

+0

Ho aggiunto del codice che mi sarei aspettato di lavorare nella domanda, ma chiaramente non lo è. Ti dispiacerebbe indicarmi la giusta direzione? Grazie! –

+0

D'accordo ... questo sicuramente non sembra funzionare, non so perché. – livingtech

+0

Come Aki ha menzionato utilemente, è necessario specificare l'opzione 'NSStringDrawingUsesLineFragmentOrigin' per i calcoli su più righe. – livingtech

6

La più recente NSExtendedStringDrawing categoria API (metodi con l'argomento NSStringDrawingOptions) si comporta in modalità singola linea. Se si desidera misurare/eseguire il rendering in modalità multi linea, si desidera specificare NSStringDrawingUsesLineFragmentOrigin.

+3

OMG! SÌ! Questo commento innocuo è ciò che ha reso 'boundingRectWithSize: options: attributes:' magicamente funziona per me! 'NSStringDrawingUsesLineFragmentOrigin' è l'opzione importante. – livingtech

13

provare questo:

bounds = [value boundingRectWithSize:size options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin attributes:attributes]; 
+5

Perché questa non è la risposta accettata? –

+0

'NSLineBreakByWordWrapping' non è un'opzione' NSStringDrawingOptions'. È definito come 0, quindi non ha alcun effetto. – titaniumdecoy

+0

@titaniumdecoy 0 non significa nessun effetto, significa default. – coneybeare

1

Ecco un esempio più completo di come si può fare questo usando boundingRectWithSize.

// get the text field 
NSTextField* field = (NSTextField*)view; 

// create the new font for the text field 
NSFont* newFont = [NSFont fontWithName:@"Trebuchet MS" size:11.0]; 

// set the font on the text field 
[field setFont:newFont]; 

// calculate the size the textfield needs to be in order to display the text properly 
NSString* text  = field.stringValue; 
NSInteger maxWidth = field.frame.size.width; 
NSInteger maxHeight = 20000; 
CGSize constraint = CGSizeMake(maxWidth, maxHeight); 
NSDictionary* attrs = [NSDictionary dictionaryWithObjectsAndKeys:NSFontAttributeName,newFont, nil]; 
NSRect newBounds = [text boundingRectWithSize:constraint 
             options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin 
             attributes:attrs]; 

// set the size of the text field to the calculated size 
field.frame = NSMakeRect(field.frame.origin.x, field.frame.origin.y, field.frame.size.width, newBounds.size.height); 

Naturalmente, per ulteriori informazioni, date un'occhiata alla documentazione di Apple: