Как сделать так, чтобы изображения в UITableViewCell плавно прокручивались? - PullRequest
2 голосов
/ 17 ноября 2011

Я загружаю изображения в свой UITableViewCell, и он становится прерывистым. У меня только около 5-10 клеток максимум.

Есть ли простые способы исправить это?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"appointmentCell";

    AppointmentTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    NSDictionary *appointmentDictionaryTemp = [self.appointmentArray objectAtIndex:indexPath.row];
    cell.patientNameLabel.text = [appointmentDictionaryTemp objectForKey:@"patient"];
    cell.appointmentTimeLabel.text = [appointmentDictionaryTemp objectForKey:@"scheduled_time"];

    NSString *urlString = [[appointmentDictionaryTemp objectForKey:@"patient_small_photo_url"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSData * imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
    UIImage * image = [UIImage imageWithData:imageData];
    cell.patientImage.image = image; 

    return cell;
}

Ответы [ 5 ]

2 голосов
/ 17 ноября 2011

dataWithContentsOfURL: ваш виновник.Он выполняет синхронный (блокирующий) сетевой запрос в основном потоке пользовательского интерфейса приложения, в результате чего табличное представление блокируется во время загрузки изображения.

Решение гораздо более сложное и включает использование NSURLConnection (илинекоторая другая сторонняя библиотека) для асинхронной загрузки данных, позволяя пользовательскому интерфейсу оставаться отзывчивым во время загрузки образа. - хороший ресурс для справки.

1 голос
/ 17 ноября 2011

Создайте ивар с именем imageCache, который является NSArray.Теперь запустите этот код в init:

for (NSDictionary *appointmentDictionaryTemp in self.appointmentArray) {        
    NSString *urlString = [[appointmentDictionaryTemp objectForKey:@"patient_small_photo_url"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSData * imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
    UIImage * image = [UIImage imageWithData:imageData];

    [imageCache addObject:image];
}

Теперь в cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"appointmentCell";

    AppointmentTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    NSDictionary *appointmentDictionaryTemp = [self.appointmentArray objectAtIndex:indexPath.row];
    cell.patientNameLabel.text = [appointmentDictionaryTemp objectForKey:@"patient"];
    cell.appointmentTimeLabel.text = [appointmentDictionaryTemp objectForKey:@"scheduled_time"];

    cell.patientImage.image = [imageCache objectAtIndex:indexPath.row]; 

    return cell;
}
0 голосов
/ 17 ноября 2011

Существует реализация с открытым исходным кодом (лицензия MIT) для отложенной / кэшированной сети изображений UIImageView, на которую вы должны взглянуть: SDWebImage . Загружает / кэширует изображения асинхронно и автоматически обновляет ваши UIImageViews.

0 голосов
/ 17 ноября 2011

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

0 голосов
/ 17 ноября 2011

Загрузка изображений асинхронно и, возможно, их кеширование.Начните с чтения этого вопроса: Ленивая загрузка изображений в UITableViewCell

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