Проблема рендеринга UILabel с использованием boundingRectWithSize в iOS 7.0.3

Я пытаюсь изменить размер UILabel, чтобы он соответствовал границам NSString, но я вижу разные результаты в iOS 7.0.3 и iOS 7.1.1. Как вы можете видеть ниже, iOS 7.0.3, похоже, неправильно отрисовывает текст.

Пример 1: Текст отрисовывается к нижней части этикетки и почти за ее пределами:

введите здесь описание изображения

Пример 2: Текст отрисовывается в 1 строку (вместо 2), переноса слов не происходит, только обрезание хвоста.

введите здесь описание изображения

Вот код, который я использую для обеих версий iOS, перечисленных выше.

CGSize boundingSize = CGSizeMake(214, 9999);
CGRect boundingRect = CGRectZero;
[self.nameLabel setNumberOfLines:2];

// for iOS7
if([self.place.placeName respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]){
    NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];

    boundingRect = [self.place.placeName boundingRectWithSize:boundingSize
                                                      options:NSStringDrawingUsesLineFragmentOrigin
                                                   attributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                                               self.nameLabel.font, NSFontAttributeName,
                                                               paragraphStyle, NSParagraphStyleAttributeName, nil]
                                                      context:nil];

}else{
    // pre iOS7
    CGSize size = [self.place.placeName sizeWithFont:self.nameLabel.font constrainedToSize:boundingSize lineBreakMode:NSLineBreakByWordWrapping];
    boundingRect = CGRectMake(0, 0, size.width, size.height);
}

[self.nameLabel setFrame:CGRectMake(CGRectGetMaxX(self.photoImageView.frame)+15,
                                    CGRectGetMinY(self.photoImageView.frame),
                                    boundingRect.size.width, boundingRect.size.height)];

[self.nameLabel setText:[place placeName]];

Есть идеи? Заранее спасибо.


person Ngoan Nguyen    schedule 09.05.2014    source источник


Ответы (3)


Я связался с Apple по поводу этой проблемы, и они подтвердили, что это ошибка в iOS 7.0.3, которая была исправлена ​​в iOS 7.1.1.

Обходной путь для этой проблемы (я использовал его раньше) состоит в том, чтобы создать свой собственный подкласс UILabel, переопределить метод - (void)drawTextInRect: и использовать метод NSString - (void)drawInRect:withAttributes: для рендеринга строки. (разработчик Apple)

person Ngoan Nguyen    schedule 17.05.2014

Просто угадаю. На скриншоте видно, что более короткая метка перенесена по словам, что указывает на то, что ширина получилась слишком короткой. Кажется, что реализация вызова boundingRectWithSize могла немного меняться от одной версии iOS к другой. Это может быть связано и с динамическими шрифтами, кто знает.

Вот несколько вещей, которые вы должны попробовать/проверить:

  • убедитесь, что для свойства numberOfLines установлено значение 0 (или, по крайней мере, достаточно большое число, чтобы разрешить перенос строк, то есть не 1.
  • дайте boundingRect максимально допустимую ширину.
  • проверьте, не меняют ли ограничения автоматического макета рамку вашей этикетки на более позднем этапе
person Mundi    schedule 09.05.2014
comment
Я проверил все три проблемы, и проблема все еще сохраняется. - person Ngoan Nguyen; 10.05.2014

используйте свойство numberOfLines, установленное как минимум на достаточно высокое число, чтобы разрешить перенос строк, т. е. labelheight/20 (изменить размер и проверить).

person Nitesh Borad    schedule 17.05.2014
comment
Я пробовал 3, 0 и даже 100. Тот же результат. Пожалуйста, смотрите мой ответ ниже, так как это известная ошибка с 7.0.3. - person Ngoan Nguyen; 18.05.2014