2014-01-22 3 views
2

Я хочу, чтобы табличное представление отображало несколько изображений в каждой прокручиваемой строке. Для этого я использую и Custom UITableViewCell, в пользовательской ячейке tableView я генерирую вид прокрутки с несколькими видами & изображений, поэтому, когда я прокручиваю таблицу, она не плавно прокручивается, ее моргает. Может ли кто-нибудь предложить мне сделать это лучше?Объектив c UITableView не прокручивается гладкой с пользовательскими ячейками и видами

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Products table view. 
    ProductCustomCell *cell = (ProductCustomCell *)[tableView dequeueReusableCellWithIdentifier:@"CatelogCell"] ;//] forIndexPath:indexPath]; 
    if (cell == nil) { 
     cell = [[ProductCustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CatelogCell"]; 
    } 
    cell.productCellDelegate = self; 
    [cell initProperties]; 
    [cell showProductsInScroll:catelogBundle]; 
} 
+0

Как вы строите свои камеры? Покажите нам XIB? Какой-то код? – Cyrille

+1

Что отображается в ячейках? Есть ли какой-либо контент, который необходимо загрузить, например изображения, которые не входят в комплект приложения? – Stavash

+2

Если у вас есть обновления по вашему вопросу, пожалуйста, отредактируйте его. Не отправляйте огромные куски кода в качестве комментария. – dandan78

ответ

5

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

  1. Cache высота строк (вид таблицы может запросить это часто), - на самом деле эта точка не является ключевым моментом, чтобы заблокировать ваш Tableview свиток.

  2. Создайте менее используемый кэш для изображений, используемых в таблице (и аннулируйте все неактивные записи при получении предупреждения о памяти). - вы можете использовать SDWebImage для загрузки изображения и кеширования. И иногда, возможно, вам захочется кэшировать некоторые изображения, которые часто используются в вашем табличном представлении, и эти изображения также могут не освобождаться, даже если вы получаете предупреждение о памяти, если ваш текущий вид является видом сверху.

  3. Нарисовать все в UITableViewCell ' s drawRect:, если это возможно, избегайте подзадач любой ценой (или если вам требуется стандартная функциональность доступности, drawRect:), - это может сэкономить некоторые расходы, но это также может стоить больше времени для кодирования и, возможно, для поддержки кодов. Но действительно полезно использовать меньше просмотров на uitableviewcell, что улучшит вашу производительность.

  4. Сделайте свой слой UITableViewCell непрозрачным (то же самое касается содержимого, если оно у вас есть) - пожалуйста, используйте слой непрозрачный как можно меньше.

  5. Используйте функциональность reusableCellIdentifier в соответствии с рекомендациями UITableView - вы должны следовать этим советам.

  6. Избегайте градиенты/сложные графические эффекты, которые предварительно не запеченные в UIImage сек - как точка 4.

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

Это действительно хорошо использовать инструменты для проверки производительности.

0

Я думаю, что проблема может быть, что вы можете выделять объекты в cellForRowAtIndexPath метод делегата от UITableView. Поэтому вместо выделения какого-либо типа объекта выделяйте его в свой класс ProductCustomCell или создайте его в своем xib-файле.

+0

Да, на самом деле это то, что я делаю до сих пор, я выделяю объект просмотра прокрутки UIView & UILabel в классе ProductCustomCell для каждой строки. – Mega

+0

Избегайте этого, он автоматически начнет прокрутку плавно –

+0

И если мне удастся помочь вам, вы можете принять мой ответ, чтобы другие пользователи также могли найти это сообщение полезным: P –

1

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

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

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

@implementation MyViewController{ 
    NSMutableArray *cells; 
    NSMutableArray *indexpaths; 
} 

... 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

    // check if in array 
    if ([indexpaths containsObject:indexPath]){ 
     return cells[indexPath.row]; 
    } 

    // otherwise, create a new one 
    UITableViewCell *cell = [[UITableViewCell alloc] init]; 

    // customizing cell 
    // other stuff 
    ... 

    // finally save the cell and indepath for checking later 
    [cells addObject:cell]; 
    [indexpaths addObject:indexPath]; 

    return cell; 
} 
+1

Это еще не решение. UITableView имеет встроенный процесс повторного использования ячеек. Изучите методы dequeueReusableCellWithIdentifier: или dequeueReusableCellWithIdentifier: forIndexPath :. Как только ячейка прокручивается с экрана, она отменяется, а затем повторно используется следующей прокруткой ячейки. Если у вас больше ячеек, чем может отображаться сразу, использование дежуривания приведет к меньшему объему памяти, чем выделение ячейки для каждой отдельной строки. Чем больше ячеек у вас есть, тем больше будет разница в памяти. – skladek

0

Я хотел бы добавить простой способ в дополнение к ответу TinyMonk. Если вы делаете uitableview с помощью пользовательской ячейки, убедитесь, что параметр подзаголовка клика отмечен как для таблицы, так и для пользовательской ячейки. Это сработало для меня.

0

Основываясь на решении Leo C han, я обновил его для Swift3.

var manualCells = NSMutableArray() 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    // check if in array 
    if manualCells.contains(indexPath) { 
     return manualCells.object(at: indexPath.row) as! UITableViewCell 
    } 

    let cell = self.tableViewReference.dequeueReusableCell(withIdentifier: "mainIdentifier") as! YourTableViewCell 

    // fill the cell...  

    manualCells.insert(cell, at: indexPath.row) 
    return cell 
} 

Примечание. Это касается таблиц, содержащих один раздел.

 Смежные вопросы

  • Нет связанных вопросов^_^