Подтвердить что ты не робот

IOS 7 BUG - NSAttributedString не появляется

На прошлой неделе я задал вопрос об ошибке симулятора с NSAttributedString, которая не отображается: iOS 7 Simulator Bug - NSAttributedString не отображается

К сожалению, теперь это выглядит не как ошибка симулятора, а ошибка iOS 7. Я сейчас воспроизвел эту проблему на устройстве iPhone 5.

Кажется, что ошибка связана с использованием NSUnderlineStyleAttributeName и NSParagraphStyleAttributeName в качестве атрибутов для NSAttributedString.

Я тестировал только два устройства iOS 7, и проблема появилась только на одном из них. Даже после того, как оба они были обновлены до той же версии:

  • 1-й iPhone 5 с iOS 7.0 (11A465): текст НЕ отображается

  • 1-й iPhone 5 после обновления до 7.0.2 (11A501): текст НЕ отображается

  • 2-й iPhone 5 с iOS 7.0 (11A4449d): текст отображается правильно

  • Второй iPhone 5 после обновления до 7.0.2 (11A501): текст НЕ отображается

Итак, Apple представила эту ошибку после iOS 7.0 (11A4449d). Я подал ошибку с ними и обновит вас на любой ответ, который я получаю.

Шаги по воспроизведению ошибок

Если вы используете iOS 7.0.2, вы должны иметь возможность воспроизвести эту ошибку.

Загрузите и запустите этот проект на своем устройстве https://github.com/rohinnz/iOS-7-BUG---NSAttributedString-does-not-appear

или

1) В Xcode 5 создайте новое приложение Single View. Назовите это всем.

2) В ViewController.m замените метод viewDidLoad следующим образом:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableParagraphStyle* paragraph = [[NSMutableParagraphStyle alloc] init];
    paragraph.alignment = NSTextAlignmentCenter;

    NSAttributedString* attrStr = [[NSAttributedString alloc] initWithString:@"Lorem ipsum dolor sit" attributes:
                                   @{NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle),
                                     NSParagraphStyleAttributeName:paragraph}];

    UILabel* myLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 0, 0)];
    myLabel.backgroundColor = [UIColor greenColor];
    myLabel.attributedText = attrStr;
    [myLabel sizeToFit];

    [self.view addSubview:myLabel];
}

3) Скомпилируйте и запустите на своем устройстве. В зависимости от вашей версии iOS 7 текст будет отображаться или не будет отображаться. Цвет фона UILabel будет отображаться в обоих случаях.

Скриншоты

iPhone 5 с iOS 7.0 (11A465)

iPhone 5 with iOS 7.0 (11A465)

iPhone 5 с iOS 7.0 (11A4449d)

iPhone 5 with iOS 7.0 (11A4449d)

Мой вопрос

Кто-нибудь может воспроизвести эту проблему на устройстве?

4b9b3361

Ответ 1

Я нашел обходной путь для этой ошибки. В вашем коде github, чтобы использовать обходной путь, вы бы сказали следующее:

NSAttributedString* attrStr = 
    [[NSAttributedString alloc] initWithString:@"Lorem ipsum dolor sit\n" // <---
    attributes:
        @{NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle),
        NSParagraphStyleAttributeName:paragraph}];

UILabel* myLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 0, 0)];
myLabel.backgroundColor = [UIColor greenColor];
myLabel.attributedText = attrStr;
[myLabel sizeToFit];

myLabel.numberOfLines = 2; // <---

Я сделал два изменения: я добавил символ новой строки в свою исходную строку, и я установил метку numberOfLines равным 2.

Каким обходным путем является наложение текста ярлыка на верх этикетки. Это, похоже, решает проблему. Другими словами, ошибка, похоже, связана с попыткой метки по вертикали центрировать свой текст; если вы намеренно делаете текст слишком длинным для размера метки, жонглируя высотой надписи, numberOfLines и лишними символами новой строки в конце текста, нарисованная строка будет нарисована.

РЕДАКТИРОВАТЬ Я нашел еще одно обходное решение по тем же самым строкам: пусть метка изменит размер в соответствии с текстом. Смотрите мой код и объяснение здесь: fooobar.com/questions/194698/... В этом коде я делаю то же самое с противоположного конца: я даю ярлыку ограничение фиксированной ширины но гибкое ограничение по высоте, и, установив собственную высоту, метка приносит верхнюю часть текста вверху самой вершины и, следовательно, может правильно отображать текст. Другими словами, это всего лишь еще один способ предотвращения ярлыка центрирования его текста по вертикали, что, по-видимому, вызывает ошибку.

ДАЛЬНЕЙШЕЕ ИЗОБРАЖЕНИЕ У меня есть смысл, что эта ошибка может быть исправлена ​​в iOS 7.1.

Ответ 2

У меня также была такая же проблема при установке цвета фона в тексте UILabel в UITableViewCell. Моим обходным путем было использование UITextView с отключенным UserInteraction вместо UILabel в ячейке, и это сработало.

Обновление: обнаружена проблема только с UILabel, включенным в Basic UITableViewCell.

Обновление 2: Также обнаружено, что проблема не возникает, когда UILabel обертывает несколько строк текста. Одним из способов является обтекание текста путем добавления новой строки и пространства. Очень хаки, но это работает. Убедитесь, что для параметра numberOfLines установлено значение 0, а для параметра lineBreakMode установлено значение NSLineBreakByWordWrapping.

Ответ 3

У меня была такая же проблема в моем приложении. Это происходило на тренажерах, а также на моем устройстве (iPhone 5 работает 7.0.2 (11A501)). Затем я понял, что мои UILabels, живущие в других ViewControllers, отображают NSAttributedStrings, используя атрибут NSUnderlineStyleSingle.

После устранения некоторых неполадок. Кажется, что если вы используете шрифт по умолчанию (я использую System 17.0), а ваш UILabel имеет высоту менее 62 пикселей, он будет отображаться правильно независимо от того, какой цвет фона, цвет текста или выравнивание вы используете. Изменение высоты UILabel на значение, превышающее 61 пиксель, позволяющее автоматически изменять размер высоты для вас или изменение шрифта на пользовательский, приведет к исчезновению подчеркнутого файла NSAttributedText.

Сначала я подумал, что эта проблема может быть связана с моим позиционированием UILabel за новой панелью состояния (или ее отсутствием), но даже в позициях, которые будут взаимодействовать с этой новой функцией, правило высоты сохраняется. Мне трудно поверить, что высота UILabel вызовет такую ​​проблему, но я пришел к выводу.

Ответ 4

Ничего себе, взял меня на то, чтобы найти это. Похоже, у меня такая же проблема, как у Инди. Установка цвета фона атрибутивной строки заставила текст просто исчезнуть. Только место, которое я могу воспроизвести, это на устройстве с iOS 7.0.3.

Ответ 5

обходной путь: используйте представление изображения

CGRect rect = self.frame;

CGRect rr = [attribText boundingRectWithSize:rect.size options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics context:nil];
UIGraphicsBeginImageContextWithOptions(rr.size, NO, 0.);
[attribText drawWithRect:rr options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics context:nil];
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imView = [[UIImageView alloc]initWithImage:image];
[self addSubview:imView];

Ответ 6

Я заметил, что эта проблема встречается аналогичным образом, но в итоге получилось другое решение. Строка иногда исчезает, а предлагаемое выше решение помогает гарантировать, что текст не исчезнет, ​​текст будет часто отображаться без каких-либо атрибутов, которые я установил (зачеркивание, разные цвета и т.д.).

Здесь настройка:

Унаследованный проект с использованием пружин и распорок, построенных с использованием Xcode 6.1.1 и iOS SDK 8.1. Проблема была более заметна на устройствах iPad по сравнению с устройствами iPhone (~ 5% времени на iPhones против 95% на iPads). Независимо от того, использовал ли я numberOfLines, sizeToFit или другие методы, атрибуты не отображались правильно на iPad или iPhone в 100% случаев.

Решением было перейти на автоматический макет и использовать вышеприведенное решение (numberOfLines = 2, sizeToFit казалось необязательным для моей ситуации)

Кажется, есть ошибка с атрибутированным текстом на UILabels с помощью Springs и Struts, когда они растягиваются горизонтально.

Надеюсь, это поможет кому-то!

Ответ 7

У меня тоже была эта проблема, и она появлялась только на определенных языках и на iOS 7.0, у меня была эта проблема, когда я хочу подчеркнуть текст на китайском языке, решил проблему с [label sizeToFit] надеюсь, что это поможет;)

Constantin.