Метод sizeWithFont устарел. boundingRectWithSize возвращает неожиданное значение

В iOS7 sizeWithFont устарел, поэтому я использую boundingRectWithSize (который возвращает значение CGRect). Мой код:

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

В textRect я получаю размер, maximumLabelSize от моего maximumLabelSize , другого размера, чем при использовании sizeWithFont . Как я могу решить эту проблему?

Как создать новый ярлык и 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]; 

Изменить: этот верхний код не подходит для iOS 7 и выше, поэтому, пожалуйста, используйте ниже:

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

Возможно, вам нужно предоставить дополнительный вариант метода, который предлагается в этом ответе:

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

Вот мой fragment рабочего кода:

 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) 

Я добавил 4px к расчетной высоте, потому что без этих 4px отсутствует одна строка.

Я использую этот fragment кода в tableView и добавляю «height» к массиву NSNumbers, и я получаю правильную высоту ячейки для textLabel по умолчанию.

Добавьте еще 4 пикселя, если вы хотите больше места под текстом в textLabel.

**** ОБНОВИТЬ ****

Я не согласен с «ошибкой ширины 40 пикселей», я кричу, что это 4 пикселя недостающей высоты, потому что 4px – это высота по умолчанию между буквой и границей одной строки. Вы можете проверить его с помощью UILabel, для шрифта 16 вам потребуется высота UILabel 20.

Но если ваша последняя строка не имеет «g» или что-то в ней, измерение может пропустить 4px высоты.

Я перепроверил его с помощью небольшого метода, я получаю точную высоту 20,40 или 60 для моего ярлыка и с правой шириной менее 300 пикселей.

Для поддержки iOS6 и iOS7 вы можете использовать мой метод:

 - (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; } 

**** ОБНОВИТЬ ****

Благодаря вашим комментариям я обновил свою функцию. Поскольку sizeWithFont устарел, и вы получите предупреждение в XCode, я добавил диагностический прагма-код, чтобы удалить предупреждение для этой конкретной функции-вызова / блока кода.

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

В дополнение к теме 4px: в зависимости от того, какой шрифт и шрифт вы используете, вычисление возвращает разные значения высоты. В моем случае: HelveticaNeue-Medium с размером шрифта 16.0 возвращает высоту строки 20.0 для одной строки, но 39.0 для двух строк, 78px для 4 строк -> 1px отсутствует для каждой строки – начиная с строки 2 – но вы хотите чтобы ваше линейное пространство fontsize + 4px для каждой строки получило высоту-результат.
Помните об этом во время кодирования!
У меня еще нет функции для этой «проблемы», но я обновлю этот пост, когда закончу.

Если я правильно понимаю, вы используете boundingRectWithSize: как способ получить размер, который вы получите с помощью sizeWithFont (что означает, что вы хотите напрямую CGSize, а не CGRect)?

Это похоже на то, что вы ищете:

Замена на устаревший размерWithFont: в iOS 7?

Они используют sizeWithAttributes: чтобы получить размер, в качестве замены для sizeWithFont.

Вы все еще получаете неправильный размер, используя что-то вроде этого:

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

Комментарий @ SoftDesigner работал для меня

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

для определения размера времени прогона метки sizewithfont устарел для iOS 7.0 вместо того, что вам нужно использовать -boundingRectWithSize: options: attributes: context: method

вы можете использовать его, как показано ниже.

 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; 

здесь вы должны указать ширину до максимальной длины для нахождения высоты или ширины.

попробуйте, это работает для меня.

  • Как я могу изменить NSArray в Objective-C?
  • Как распечатать имя метода и номер строки и условно отключить NSLog?
  • UIScrollView - показывает полосу прокрутки
  • UITextView с подсветкой синтаксиса
  • Как прокрутить UITableView в определенную позицию
  • Как использовать UIPanGestureRecognizer для перемещения объекта? iPhone / IPad
  • Получение времени, прошедшего в Objective-C
  • Тип аксессуара UITableViewCell, проверенный на доступ и установка других непроверенных
  • всплывающее меню iPhone, как iPad popover?
  • Перетаскивание UIView внутри UIScrollView
  • как отобразить тестовый баннер IAd в симуляторе
  • Давайте будем гением компьютера.