UICollectionViewCell UILabel с атрибутом NSMutableAttributedStringText медленно обновляется и отображается

Использование iOS 8.1.2 на iPad и iPhone. У меня есть UICollectionViewCells, которые создаются с initWithCoder: из XIB и отображаются в UICollectionView с

[_collectionView registerNib:[UINib nibWithNibName:@"HomeFeedCell" bundle:nil] forCellWithReuseIdentifier:CELL_IDENTIFIER];

Ячейка xib шаблона содержит UILabel с текстом по умолчанию. Ячейка также настроена на использование ограничений автоматического размещения.

Когда создается экземпляр ячейки и обновляется ее данные, я вызываю следующий метод для обновления приписанного текста:

- (void)setLabelsForData:(NSDictionary*)dict_data {

    NSMutableAttributedString* attributedText_date = [[NSMutableAttributedString alloc] initWithString:[self dateStringForTimestamp:[dict_data objectForKey:@"ts"]]];
    NSMutableAttributedString* attributedText_time = [[NSMutableAttributedString alloc] initWithString:[self timeStringForTimestamp:[dict_data objectForKey:@"ts"]]];

    UIFont* font_date = [UIFont fontWithName:@"Helvetica-Bold" size:12.0];
    UIFont* font_time = [UIFont fontWithName:@"Helvetica" size:12.0];

    [attributedText_date addAttribute:NSFontAttributeName value:font_date range:NSMakeRange(0, attributedText_date.length)];
    [attributedText_time addAttribute:NSFontAttributeName value:font_time range:NSMakeRange(0, attributedText_time.length)];

    dateLabel.attributedText = attributedText_date;
    timeLabel.attributedText = attributedText_time;

}

Однако, когда UICollectionView выдвигается модально, когда видимые ячейки первоначально отображаются, и каждая показывает свой атрибутный текст UILabel в своей исходной xib-форме по умолчанию в течение примерно 1 секунды, прежде чем, наконец, выполнить обновление с правильными данными и форматированием. Как только UICollectionView был показан, хотя UILables не имеют этой проблемы при прокрутке этих ячеек и любых новых. Только изначально на видимых при появлении UICollectionView.

Я пытался:

[cell setNeedsDisplay];
[cell setNeedsLayout];
[collectionView invalidateLayout];

в конце метода. Я даже поместил весь метод в основной поток, надеясь, что это проблема потока, но не повезло.

Что может быть причиной медленного обновления UILabel?

1 ответ

Немного поздно, но, похоже, у меня та же проблема, самым простым решением для меня было обновить UILabel в
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
(этот метод доступен в IOS 8 и выше).
Я также сталкиваюсь с той же проблемой с UITableView

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
Другие вопросы по тегам