Вялая прокрутка при использовании QuartzCore для скругления углов на UIImageView в UITableViewCell - PullRequest
5 голосов
/ 18 апреля 2011

Я использую QuartzCore, чтобы добавить закругленные углы к моим UIImageView в ячейках моего UITableView

Это код, который я использую:

fooImageView.layer.cornerRadius = 9.0;
fooImageView.layer.masksToBounds = YES;
fooImageView.layer.borderWidth = 1.0;

Проблема в том, что когда я добавляю этот код. Движение ячеек таблицы резко замедляется. Мне просто интересно, есть ли другие альтернативы, позволяющие значительно ускорить работу пользователя и повысить производительность при прокрутке ячейки табличного представления с помощью этой техники?

Я вижу много приложений (большинство приложений Twitter), у которых нет снижения производительности, когда закругленные углы применяются к изображениям в их ячейках. Просто интересно как они преодолевают "медлительность"?

Спасибо за вашу помощь.

Ответы [ 5 ]

15 голосов
/ 18 апреля 2011

Первое, что я бы попробовал сделать, это установить:

fooImageView.layer.shouldRasterize = YES;

Это делает эффект закругленного угла растровым. У меня были некоторые похожие проблемы при использовании эффектов CALayer для представлений в UIScrollView некоторое время назад, и этот параметр значительно улучшил производительность.

Не забудьте установить

fooImageView.layer.rasterizationScale = [[UIScreen mainScreen] scale];

для предотвращения пикселизации (растеризация при неправильном разрешении для устройства).

5 голосов
/ 18 апреля 2011

Существует 3 основных метода улучшения производительности UITableView, которые я использую:

  1. Всегда повторно используйте ячейки, используйте dequeuereusablecellwithidentifier при создании новых ячеек.Это предотвращает накладные расходы ОС на создание и уничтожение большого количества объектов при быстрой прокрутке.

  2. Свернуть иерархию представлений ячейки.Вместо того, чтобы иметь много видов и подпредставлений, создайте собственный вид и сделайте все свои рисунки ячейки в drawRect.Такие приложения, как Twitter, используют этот подход для сверхбыстрого рисования ячеек.

  3. Убедитесь, что ваши изображения непрозрачны.Это можно сделать, убедившись, что во всех активах изображений нет запеченных альфа-каналов, и установив для непрозрачного свойства слоя значение YES.

Примеры:

ВcellForRowAtIndexPath (строка идентификатора таблицы просто создает ссылку на ячейки того же типа и может быть любым, что вам нравится):

static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier];
// Create a new cell if necessary
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:SimpleTableIdentifier] autorelease];
}

Проверьте следующую ссылку для примеров улучшения производительности UITableViews: http://developer.apple.com/library/ios/#samplecode/TableViewSuite/Introduction/Intro.html%23//apple_ref/doc/uid/DTS40007318-Intro-DontLinkElementID_2

Надеюсь, это поможет,

Дейв

2 голосов
/ 18 апреля 2011

Вы могли бы сделать некоторые маскировки.Наложение изображений с изображением маски, у которого вырезан квадрат с закругленными углами, и это будет работать как шарм.

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

1 голос
/ 18 апреля 2011

Краткий ответ: установите непрозрачные ячейки и нарисуйте их сами.

Следуйте советам StuDave и Magic Bullet, а также см. Быстрая прокрутка в Tweetie с UITableView от автора официального клиента Twitter, чтобы не узнать, как рисовать ячейки. Это простой и понятный пример проекта.

Помимо решения этой конкретной проблемы, вы должны прочитать Создание, рисование и управление UITableView (пересмотренный) Мэттом Галлахером, чтобы научиться писать собственные контроллеры таблиц и ячейки. Это не только повышает производительность вашего кода, но и позволяет делать то, что невозможно с помощью стандартных классов Apple. По сути, вы создадите UIViewController, который копирует ключевые методы UITableViewController.

0 голосов
/ 26 ноября 2015

В моем случае это добавило бесконечные подпредставления, и табличное представление резко замедлилось точно так, как вы сказали.Я добавил эту логику в willDisplayCell, чтобы решить проблему:

if cell.contentView.subviews.count < 3 /* elements in cell + subviews */  { 

        cell.contentView.addSubview(subView)
        cell.contentView.sendSubviewToBack(subView)

 }
...