Добавлена ​​тень для UIImageView на UITableView убивает производительность ... почему? - PullRequest
7 голосов
/ 29 марта 2012

У меня есть UITableView, который имеет три UIImageView представления на ячейку, причем три ячейки отображаются на виде одновременно (всего девять UIImageView просмотров).Думайте об этом как о книжной полке.Иногда у меня может быть до 500 книг.

Я добавил тень к UIImageView с кодом, который выглядит так:

UIImageView *itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(25, 7, 65, 75)];
itemImageView.contentMode = UIViewContentModeScaleAspectFit;
itemImageView.tag = 6;
itemImageView.layer.shadowColor = [UIColor blackColor].CGColor;
itemImageView.layer.shadowOffset = CGSizeMake(3, -1);
itemImageView.layer.shadowOpacity = 0.7;
itemImageView.layer.shadowRadius = 3.0;
itemImageView.clipsToBounds = NO;
[cell.contentView addSubview:itemImageView];

Когда я добавляю код тени, как видновыше, производительность прокрутки просто полностью убита и становится прерывистой.Каждое изображение имеет различную Rect, поэтому для каждого элемента должна быть создана тень при прокрутке.У кого-нибудь есть советы о том, как добавить тени к моим изображениям на UITableView без этой проблемы?

Ответы [ 6 ]

9 голосов
/ 29 марта 2012

Вы можете увидеть улучшение производительности, если вы добавите

itemImageView.layer.shadowPath =
       [UIBezierPath bezierPathWithRect:itemImageView.layer.bounds].CGPath;

Но в целом подобные операции с слоями снижают производительность в табличном представлении. У меня возникла точно такая же проблема, и мы просто устранили эффект тени. Это того не стоило.

3 голосов
/ 30 марта 2012

Вам следует ознакомиться с видеороликами WWDC о лучших практиках CoreAnimation. Вы можете запросить кэширование растеризованной копии тени в памяти. Какао определенно достаточно быстр, чтобы рендерить эти тени на лету, не возвращаясь к предварительно отрендеренному изображению.

Пример:

itemImageView.layer.shouldRasterize = YES;

Также я проголосовал за ответ относительно UIBezierPath. Это также упоминается в лучших практиках, но установка теневого пути CALayer - это огромный прирост производительности. Вы также можете создавать интересные спецэффекты, управляя путем тени.

1 голос
/ 06 июня 2013

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

if(cell == nil){
    //layout cell

Это немного оптимизировало прокрутку, но довольно изменчиво.

Для оптимизации качества ваших изображений вы также должны добавить растровую шкалу, если вы активировали «shouldRasterize»:

aLabel.layer.shouldRasterize = YES;
aLabel.layer.rasterizationScale = [[UIScreen mainScreen] scale];

Может быть, у кого-то есть идеи, как оптимизировать код, чтобы получить нормальную прокрутку iOS. ТНХ

1 голос
/ 29 марта 2012

Тени дороги и убьют вашу производительность.

Лучшим подходом является рендеринг затененного изображения в фоновом режиме, кэширование / сохранение и отображение его на виде, когда оно будет готово.

Редактировать: Вы хотите посмотреть на подпрограммы Core Graphics / CGImage. В частности, CGContextSetShadowWithColor нарисует вам тень.

http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CGContext/Reference/reference.html

0 голосов
/ 30 марта 2012

Проверьте мой же вопрос здесь: Приложение работает медленно из-за UIImageViews

Я бы использовал этот код:

imageView.layer.masksToBounds = NO;
UIBezierPath *path = [UIBezierPath imageView.bounds];
imageView.layer.shadowPath = path.CGPath;
0 голосов
/ 29 марта 2012

Вы активируете повторное использование?Если нет, ячейки будут переделываться каждый раз при изменении вида (например, во время прокрутки).Это наверняка съест много производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...