2013-09-16 4 views
6

Я обновляю свое приложение до iOS 7 и, наконец, получил его, но есть одна вещь, на которую я не могу найти решение.sizeWithFont: constrainedToSize: lineBreakMode: устарел в iOS7

В Xcode 4 Я использовал следующий метод:

#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); 
} 

Но я получаю сообщение об ошибке при использовании его в прошивке 7:

Использование -boundingRectWithSize: опции: атрибуты: контекст :

Я не знаю, как конвертировать мою более раннюю версию в этот новый метод, и было бы здорово, если бы кто-нибудь мог это сделать Мне. Заранее спасибо.

ответ

5

sizeWithFont методы были устаревшими в iOS7. Вместо этого вы должны использовать boundingRectWithSize. Если вам также необходимо поддерживать предыдущие версии IOS, то вы можете использовать следующий код:

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 API, который вы используете, устарел на 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 

Вы можете использовать API предложение следующим образом:

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

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

Если вы только поддержку iOS6 и позже, вы можете конвертировать ваши NSStrings в NSAttributedStrings и использовать NSAttributedString «s boundingRectWithSize:options:context:.

Что-то, что выглядело, как это раньше:

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

Может быть легко преобразованы в это и работать как в iOS6 и 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; 

Как примечание стороны, благо делать вещи это так что ваш размер текста в ios6 теперь потокобезопасен. Старые методы sizeWithFont:... принадлежали UIStringDrawing, которые могли бы сбой, если бы вы запускали sizeWithFont:... на двух потоках одновременно. В ios6 были открыты новые функции NSStringDrawing для NSAttributedStrings, а функция boundingRectWithSize:... является потокобезопасной. Я предполагаю, что именно поэтому в ios7 старые функции sizeWithFont:... были устаревшими.

Обратите внимание на документацию упоминает:

В прошивке 7 и более поздний, этот метод возвращает дробных размеры (в компоненте возвращенного CGRect размера ); чтобы использовать возвращаемый размер в размере просмотров, вы должны использовать поднимите его значение до ближайшего высшего целого , используя функцию ceil.

Так вытащить расчетную высоту или ширину, которая будет использоваться для калибровки точки зрения, я хотел бы использовать:

CGFloat height = ceilf(size.height); 
CGFloat width = ceilf(size.width); 
Смежные вопросы