2013-09-16 5 views
6

Sto aggiornando la mia app su iOS 7 e finalmente l'ho ottenuta, ma c'è una cosa per cui non riesco a trovare una soluzione.sizeWithFont: constrainedToSize: lineBreakMode: deprecato in iOS7

In Xcode 4 Ho usato il seguente metodo:

#define FONT_SIZE 14.0f 
#define CELL_CONTENT_WIDTH 280.0f 
#define CELL_CONTENT_MARGIN 10.0f 


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; { 
    NSString *text = [textA objectAtIndex:[indexPath row]]; 

    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping]; 

    CGFloat height = MAX(size.height, 28.0f); 

    return height + (CELL_CONTENT_MARGIN * 2); 
} 

Ma avrò un errore quando lo si utilizza in iOS 7:

Uso -boundingRectWithSize: opzioni: attributi: contesto :

Non so come convertire la mia versione precedente in questo nuovo metodo e sarebbe bello se qualcuno potesse lp me Grazie in anticipo.

risposta

5

sizeWithFont metodi sono stati deprecati in iOS7. È necessario utilizzare invece boundingRectWithSize. Se hai bisogno anche di supportare le versioni precedenti di iOS, è possibile utilizzare il codice seguente:

CGSize size = CGSizeZero; 

if ([label.text respondsToSelector: @selector(boundingRectWithSize:options:attributes:context:)] == YES) { 
    size = [label.text boundingRectWithSize: constrainedSize options: NSStringDrawingUsesLineFragmentOrigin 
           attributes: @{ NSFontAttributeName: label.font } context: nil].size; 
} else { 
    size = [label.text sizeWithFont: label.font constrainedToSize: constrainedSize lineBreakMode: UILineBreakModeWordWrap]; 
} 
2

sizeWithFont L'API utilizzata è obsoleta su iOS7.

// See UIStringDrawing.h 
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode NS_DEPRECATED_IOS(2_0, 7_0, "Use -boundingRectWithSize:options:attributes:context:"); // NSTextAlignment is not needed to determine size 

È possibile utilizzare l'API suggerimento in questo modo:

NSMutableDictionary *atts = [[NSMutableDictionary alloc] init]; 
[atts setObject:myFont forKey:NSFontAttributeName]; 

CGRect rect = [myText boundingRectWithSize:constraint 
           options:NSStringDrawingUsesLineFragmentOrigin 
           attributes:atts 
           context:nil]; 
4

Se siete solo di supporto iOS6 e più tardi, è possibile convertire il vostro NSStrings per NSAttributedStrings e utilizzare NSAttributedString s' boundingRectWithSize:options:context:.

qualcosa che sembrava questo prima:

CGSize size = [text sizeWithFont:font 
       constrainedToSize:(CGSize){maxWidth, CGFLOAT_MAX}]; 

potrebbe essere facilmente convertiti a questo e il lavoro in entrambi iOS6 e iOS7:

NSAttributedString *attributedText = 
    [[NSAttributedString alloc] 
     initWithString:text 
     attributes:@ 
     { 
      NSFontAttributeName: font 
     }]; 
CGRect rect = [attributedText boundingRectWithSize:(CGSize){maxWidth, CGFLOAT_MAX} 
              options:NSStringDrawingUsesLineFragmentOrigin 
              context:nil]; 
CGSize size = rect.size; 

Come nota a margine, il vantaggio di fare le cose in questo è così che il tuo ridimensionamento del testo in ios6 è ora sicuro per i thread. I vecchi metodi di sizeWithFont:... appartenevano a UIStringDrawing, che si arrestava in modo anomalo se si eseguiva lo sizeWithFont:... su due thread contemporaneamente. In ios6, le nuove funzioni NSStringDrawing per NSAttributedStrings sono state esposte e la funzione boundingRectWithSize:... è thread-safe. Sto indovinando questo è il motivo per cui in iOS7, le vecchie funzioni sizeWithFont:... sono state deprecate.

Si prega di notare la documentazione menzioni:

In iOS 7 e versioni successive, questo metodo restituisce dimensioni frazionarie (nel componente dimensione del CGRect restituiti); per utilizzare una dimensione restituita alle dimensioni visualizzazioni, è necessario utilizzare il valore aumentato al numero intero più vicino più vicino utilizzando la funzione ceil.

Quindi, per tirare fuori l'altezza o la larghezza calcolata da utilizzare per il dimensionamento di vista, vorrei utilizzare:

CGFloat height = ceilf(size.height); 
CGFloat width = ceilf(size.width);