Il metodo sizeWithFont è deprecato. boundingRectWithSize restituisce un valore imprevisto

In iOS7, sizeWithFont è deprecato, quindi utilizzo boundingRectWithSize (che restituisce un valore CGRect). Il mio codice:

  UIFont *fontText = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16]; // you can use your font. CGSize maximumLabelSize = CGSizeMake(310, 9999); CGRect textRect = [myString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:fontText} context:nil]; expectedLabelSize = CGSizeMake(textRect.size.width, textRect.size.height); 

In textRect , ho una dimensione maggiore del mio maximumLabelSize , una dimensione diversa rispetto a quando si usa sizeWithFont . Come posso risolvere questo problema?

Che ne dici di creare una nuova etichetta e usare sizeThatFit:(CGSize)size ??

 UILabel *gettingSizeLabel = [[UILabel alloc] init]; gettingSizeLabel.font = [UIFont fontWithName:@"YOUR FONT's NAME" size:16]; gettingSizeLabel.text = @"YOUR LABEL's TEXT"; gettingSizeLabel.numberOfLines = 0; gettingSizeLabel.lineBreakMode = NSLineBreakByWordWrapping; CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX); CGSize expectSize = [gettingSizeLabel sizeThatFits:maximumLabelSize]; 

Modifica: questo codice superiore non è valido per iOS 7 e versioni successive, quindi si prega di utilizzare di seguito:

 CGRect textRect = [myString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin| NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:fontText} context:nil]; 

Forse è necessario fornire un’opzione aggiuntiva al metodo suggerito in questa risposta:

 CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX); CGRect textRect = [myString boundingRectWithSize:maximumLabelSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName: fontText} context:nil]; 

Ecco il mio frammento di codice funzionante:

 NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:attributeDict]; NSString *headline = [dict objectForKey:@"title"]; UIFont *font = [UIFont boldSystemFontOfSize:18]; CGRect rect = [headline boundingRectWithSize:CGSizeMake(300, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil]; CGFloat height = roundf(rect.size.height +4) 

Ho aggiunto 4px all’altezza calcasting, perché senza questi 4px manca una riga.

Io uso questo frammento di codice in una tabellaView e aggiungo “height” a una matrice di NSNumbers e ottengo l’altezza della cella corretta per il textLabel predefinito.

Aggiungi altri 4 pixel se vuoi più spazio sotto il testo nella textLabel.

**** AGGIORNARE ****

Non sono d’accordo con il “bug di larghezza di 40px”, urlo essere il 4px di altezza mancante, perché 4px è l’altezza di default di uno spazio tra una lettera e il limite di una singola linea. Puoi controllarlo con un UILabel, per un fontsize di 16 hai bisogno di un’altezza UILabel di 20.

Ma se la tua ultima riga non ha “g” o altro, la misurazione potrebbe perdere il 4px di altezza.

L’ho ricontrollato con un piccolo metodo, ho ottenuto un’altezza precisa di 20,40 o 60 per la mia etichetta e una larghezza giusta inferiore a 300 px.

Per supportare iOS6 e iOS7, puoi utilizzare il mio metodo:

 - (CGFloat)heightFromString:(NSString*)text withFont:(UIFont*)font constraintToWidth:(CGFloat)width { CGRect rect; float iosVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; if (iosVersion >= 7.0) { rect = [text boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil]; } else { CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping]; rect = CGRectMake(0, 0, size.width, size.height); } NSLog(@"%@: W: %.f, H: %.f", self, rect.size.width, rect.size.height); return rect.size.height; } 

**** AGGIORNAMENTO ****

Grazie ai tuoi commenti, ho aggiornato la mia funzione come seguito. Poiché sizeWithFont è deprecato e riceverai un avviso in XCode, ho aggiunto il codice pragma diagnostico per rimuovere l’avviso per questa particolare funzione chiamata / blocco di codice.

 - (CGFloat)heightFromStringWithFont:(UIFont*)font constraintToWidth:(CGFloat)width { CGRect rect; if ([self respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) { rect = [self boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil]; } else { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" CGSize size = [self sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping]; rect = CGRectMake(0, 0, size.width, size.height); #pragma GCC diagnostic pop } return ceil(rect.size.height); } 

Oltre all’argomento 4px: a seconda del tipo di carattere e del tipo di carattere che si utilizza, il calcolo restituisce valori di altezza diversi. Nel mio caso: HelveticaNeue-Medium con un fontsize di 16,0 restituisce un line-height di 20.0 per una singola riga ma 39.0 per due linee, 78px per 4 linee -> 1px mancante per ogni riga – che inizia con la linea 2 – ma si desidera per avere il tuo fontsize + 4px linespace per ogni linea devi ottenere un risultato in altezza.
Si prega di tenerlo a mente durante la codifica!
Non ho ancora una funzione per questo “problema”, ma aggiornerò questo post quando avrò finito.

Se ho capito bene, stai usando boundingRectWithSize: proprio come un modo per ottenere le dimensioni che otterresti con sizeWithFont (nel senso che vuoi direttamente il CGSize, non il CGRect)?

Questo sembra quello che stai cercando:

Sostituzione per sizeWithFont deprecato: in iOS 7?

Stanno usando sizeWithAttributes: per ottenere la dimensione, in sostituzione di sizeWithFont.

Hai ancora le dimensioni sbagliate usando qualcosa del genere:

 UIFont *fontText = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16]; // you can use your font. expectedLabelSize = [myString sizeWithAttributes:@{NSFontAttributeName:fontText}]; 

Il commento del @ SoftDesigner ha funzionato per me

 CGRect descriptionRect = [description boundingRectWithSize:CGSizeMake(width, 0) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12]} context:nil]; result = ceil(descriptionRect.size.height); 

per trovare la dimensione del tempo di esecuzione dell’etichetta sizewithfont è deprecato per iOS 7.0 invece di usare -boundingRectWithSize: options: attributes: context: method

puoi usarlo come sotto il codice

 CGSize constraint = CGSizeMake(MAXIMUM_WIDHT, TEMP_HEIGHT); NSRange range = NSMakeRange(0, [[self.message body] length]); NSDictionary *attributes = [YOUR_LABEL.attributedText attributesAtIndex:0 effectiveRange:&range]; CGSize boundingBox = [myString boundingRectWithSize:constraint options:NSStringDrawingUsesFontLeading attributes:attributes context:nil].size; int numberOfLine = ceil((boundingBox.width) / YOUR_LABEL.frame.size.width); CGSize descSize = CGSizeMake(ceil(boundingBox.width), ceil(self.lblMessageDetail.frame.size.height*numberOfLine)); CGRect frame=YOUR_LABEL.frame; frame.size.height=descSize.height; YOUR_LABEL.frame=frame; 

qui devi dare larghezza alla lunghezza massima per trovare altezza o larghezza.

prova questo funziona per me.