Почему низкая производительность прокрутки для пользовательских табличных ячеек с объектами UISegmentedControl?
У меня есть UITableView с настраиваемыми ячейками, которые были определены в файле xib, и я испытываю плохую производительность прокрутки (изменчивость) на моем устройстве, когда у них есть UISegmentedControl. Заявления NSLog показывают, что ячейки распределяются и повторно используются так, как они должны. Мой код для метода cellForRowAtIndexPath приведен ниже. Соединения выполняются в xib согласно документации Apple. (Плавно прокручивается в симуляторе)
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil)
{
[[NSBundle mainBundle] loadNibNamed:@"TableViewCell"
owner:self
options:nil];
cell = self.tvCell;
self.tvCell = nil;
}
cell.layer.shouldRasterize = YES; // build error is here
UILabel *lbl = (UILabel *)[cell viewWithTag:1];
[lbl setText:[NSString stringWithFormat:@"Q%i", indexPath.row+1]];
return cell;
}
Ответы
Ответ 1
Любой чертеж, который должна выполнять ячейка таблицы во время прокрутки, будет вызывать проблемы с производительностью; когда у вас много подзаголовков, обычно происходит много рисования, и это, как вы заметили, делает вашу прокрутку довольно изменчивой. Существует несколько способов уменьшить это.
Первый шаг состоит в том, чтобы убедиться, что ваши ячейки и как можно больше их подзаголовков имеют свои свойства opaque
, установленные на YES
. Непрозрачные взгляды не должны смешиваться с содержимым под ними, и это экономит много времени.
Вы также можете настроить уровни своих ячеек для растеризации, например:
cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
Это приведет к краху вашей иерархии представлений в одно плоское растровое изображение, которое является тем, что Core Animation просто любит рисовать. Обратите внимание, что любые анимационные индикаторы вида активности, например, заставят обновлять растровые изображения каждый раз, когда они меняются, т.е. Много. В этом случае вы не захотите, чтобы ячейка растеризовала все; вы можете просто использовать subview со всеми вашими относительно статическими представлениями (например, ярлыками) под другим подзоном с любым таким динамическим контентом и только иметь первый из этих растрированных.
Ответ 2
Убедитесь, что ваш идентификатор "MyIdentifier" в xib. Вы получите хороший удар производительности, если это не так. Я предполагаю, что "выделенные и повторно используемые, как они должны" означают несколько выделенных при запуске и больше не выделяемых после. Если это правда, вы, вероятно, все настроены.
Еще один способ повысить производительность - создать табличный вид с кодом. Это намного быстрее, чем использование xib. Когда я создаю представления таблиц, я обычно создаю их в IB, затем копирую значения фрейма в код и строю в коде.
Отложите время на просмотр видеороликов WWDC 2010. Много отличной информации, я узнаю что-то новое каждый раз, когда я их смотрю.