Метод 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
, другого размера, чем при использовании sizeWithFont
. Как я могу решить эту проблему?
Ответы
Ответ 1
Как создать новую метку и использовать sizeThatFit:(CGSize)size
??
UILabel *gettingSizeLabel = [[UILabel alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:@"YOUR FONT NAME" size:16];
gettingSizeLabel.text = @"YOUR LABEL 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];
Ответ 2
Возможно, вам нужно предоставить дополнительный вариант метода, который предлагается в этом:
CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX);
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName: fontText}
context:nil];
Ответ 3
Вот мой фрагмент рабочего кода:
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 отсутствует одна строка.
Я использую этот фрагмент кода в таблицеView и добавляю "height" к массиву NSNumbers, и я получаю правильную высоту ячейки для textLabel по умолчанию.
Добавьте еще 4 пикселя, если вы хотите больше места под текстом в textLabel.
**** ОБНОВЛЕНИЕ ****
Я не согласен с "ошибкой ширины 40px", я кричу, что это 4px недостающей высоты, потому что 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;
}
**** UPGRADE ****
Благодаря вашим комментариям я обновил свою функцию. Поскольку 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 для каждой строки получило высоту-результат.
Помните об этом во время кодирования!
У меня еще нет функции для этой" проблемы", но я обновлю это сообщение, когда закончим.
Ответ 4
Если я правильно понимаю, вы используете boundingRectWithSize: как способ получить размер, который вы получите с помощью sizeWithFont (что означает, что вы хотите напрямую CGSize, а не CGRect)?
Это похоже на то, что вы ищете:
Замена для устаревших sizeWithFont: в iOS 7?
Они используют sizeWithAttributes: чтобы получить размер, в качестве замены для sizeWithFont.
Вы по-прежнему получаете неправильный размер, используя что-то вроде этого:
UIFont *fontText = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
// you can use your font.
expectedLabelSize = [myString sizeWithAttributes:@{NSFontAttributeName:fontText}];
Ответ 5
Комментарий @SoftDesigner работал у меня
CGRect descriptionRect = [description boundingRectWithSize:CGSizeMake(width, 0)
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12]}
context:nil];
result = ceil(descriptionRect.size.height);
Ответ 6
для определения размера времени выполнения метки sizewithfont устарел для iOS 7.0 вместо того, чтобы использовать метод -boundingRectWithSize: options: attributes: context:
> вы можете использовать его, как показано ниже.
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;
здесь вы должны указать ширину до максимальной длины для нахождения высоты или ширины.
попробуйте это, он работает для меня.