2010-04-23 16 views
6

So che c'è questa:Come calcolare l'altezza del rettangolo di testo da una NSString?

sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 

Ma poiché la CGSize ha sempre la stessa altezza e non si adatta a qualsiasi shrinked testo o di sorta, il CGSize non dice come altezza del testo è.

Esempio: crea un UILabel con 320 x 55 punti e inserisci un testo loooooooooooooong. Lascia che l'etichetta riduca il testo verso il basso. Sorpresa: CGSize.height rimane alla stessa altezza anche se il testo è così piccolo che è necessario un microscopio.

Ok, quindi dopo aver sbattuto la testa contro il mio macbook pro che è a metà rotta ora, l'unico pensiero che può aiutare è quella brutta dimensione effettiva. Ma la dimensione del carattere è in pica, penso, non è proprio quello che si ottiene sullo schermo, non è vero?

Quando la dimensione del font è 10, il mio testo è veramente alto di 10 punti al massimo? Una volta ogni tanto ho provato esattamente questo, e non appena il testo aveva una y o un carattere che si estende al di sotto (come quella coda di un y), è fuori limite e l'intero testo è più grande di 10 punti.

Quindi, come si calcola l'altezza del testo reale per un singolo codice Uilabel senza ottenere una lunga barba e qualche esperienza ospedaliera?

risposta

2

Suona come dopo aver ottenuto la dimensione effettiva del carattere da quella chiamata di funzione, è necessario chiamare di nuovo con quella nuova dimensione:

NSString* yourString = @"SomeString"; 
float actualSize; 
[yourString sizeWithFont:yourFont 
      minFontSize:minSize 
      actualFontSize:&actualSize 
       forWidth:rectWidth 
      lineBreakMode:breakMode]; 

CGSize size = [yourString sizeWithFont:[UIFont fontWithName:fontName size:actualSize]]; 
+0

Questo funziona. Non è la cosa più efficiente sulla terra ma, finché la mela non risolve il bug (non trattenere il respiro), funziona. – DougW

3

Prova di questo codice:

CGSize maximumSize = CGSizeMake(300, 9999); 
NSString *myString = @"This is a long string which wraps"; 
UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14]; 
CGSize myStringSize = [myString sizeWithFont:myFont 
    constrainedToSize:maximumSize 
    lineBreakMode:self.myLabel.lineBreakMode]; 

dalla mia risposta here

Esso utilizza un metodo diverso, e imposta un altissimo CGSize alla partenza (che viene poi ridotto per adattare la stringa)

+0

Bene, ma voglio che il testo sia premuto per adattarsi a un sm tutto il rettangolo ... – dontWatchMyProfile

+0

Provato, ma non funziona. Quando il testo viene ridotto dall'etichetta, l'altezza rimane la stessa. Ho anche provato a fornire il rect del frame delle etichette come maximumSize. – dontWatchMyProfile

+0

Hai impostato 'adjustsFontSizeToFitWidth' per evitare che la dimensione del carattere si riduca? O vuoi che la dimensione si riduca con l'etichetta? –

1

Hai anche impostato label.numberOfLines = 0;?

+0

no, ma è così importante da fare? anche, perché 0? non è almeno una linea? – dontWatchMyProfile

+0

Questa proprietà imposta il numero massimo possibile di linee mostrate.1 è il valore predefinito. 0 significa che l'etichetta non limiterà il numero di linee. – Skie

3

Importante: Come di iOS 7.0 è deprecato il seguente metodo.

sizeWithFont: minFontSize: actualFontSize: forWidth: lineBreakMode:

Utilizza il codice qui sotto invece

CGRect frame = [cellText boundingRectWithSize:CGSizeMake(568,320) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:32.0f]} context:nil]; 
float height = frame.size.height; 
0

Dopo l'esecuzione di questo codice frame.size avrà l'altezza e la larghezza del NSString esattamente ..

NSString *text = @"This is my Mac"; 
textFont = [NSFont fontWithName:@"HelveticaNeue-Medium" size: 80.f]; 
textColor = [NSColor yellowColor]; 
NSDictionary *attribs = @{ NSForegroundColorAttributeName:textColor, 
          NSFontAttributeName: textFont }; 
CGRect frame = [text boundingRectWithSize:CGSizeMake(0,0) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics attributes:attribs context:nil]; 
Problemi correlati