Почему производительность прокрутки плохая для пользовательских ячеек табличного представления, содержащих объекты UISegmentedControl? - PullRequest
14 голосов
/ 14 июля 2010

У меня есть 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;
}

Ответы [ 2 ]

47 голосов
/ 14 июля 2010

Любой рисунок, который ячейка таблицы должна выполнять во время прокрутки, вызовет проблемы с производительностью;когда у вас много подпредставлений, обычно происходит много рисования, и это, как вы заметили, сделает прокрутку довольно изменчивой.Есть несколько способов уменьшить это.

Первый шаг - убедиться, что для ваших ячеек и как можно большего числа их подпредставлений свойства opaque установлены на YES.,Непрозрачные представления не должны смешиваться с содержимым под ними, и это экономит много времени.

Возможно, вы также захотите настроить слои своих ячеек для их растеризации, например:

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

Это сведет вашу иерархию представлений в одно плоское растровое изображение, и именно это Core Animation просто любит рисовать.Обратите внимание, что любые анимационные представления - например, индикаторы активности - будут заставлять это растровое изображение обновляться каждый раз, когда они меняются, то есть много.В этом случае вы не захотите, чтобы ячейка растеризировала все;вы можете просто использовать подпредставление со всеми вашими относительно статичными представлениями (например, надписями) под другим подпредставлением с любым таким динамическим содержимым, и иметь только первое из них растеризованных.

3 голосов
/ 11 апреля 2011

Убедитесь, что ваш идентификатор «MyIdentifier» в XIB. Вы получите хороший результат производительности, если это не так. Я предполагаю, что «выделено и повторно использовано так, как должно» означает несколько выделенных при запуске и больше не распределенных после. Если это правда, то вы, вероятно, все готово.

Еще один способ повысить производительность - создать табличное представление с помощью кода. Это намного быстрее, чем использование XIB. Когда я создаю табличные представления, я обычно строю их в IB, затем копирую значения фрейма в код и создаю в коде.

Уделите время просмотру видео с выступления на WWDC 2010. Много полезной информации, я узнаю что-то новое каждый раз, когда смотрю их.

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