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;