2017-01-13 2 views
0

У меня есть UICollectionView с UIImageView внутри UICollectionViewCells. Я использую это popolate:UICollectionViewCell показывает неправильное изображение

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100]; 

    int index = (int)indexPath.row; 
    NSString* image = [imagesUri objectAtIndex:index]; 

    if([recipeImageView image] == nil){ 
     UIImage* img = [UIImage imageWithContentsOfFile:image]; 
     recipeImageView.contentMode = UIViewContentModeScaleAspectFit; 
     recipeImageView.image = img; 
    } 

    return cell; 
} 

Все работает отлично, но когда я прокручиваю, изображение внутри клеток является неправильным. Отладка я вижу, что переменная img всегда правильная.

Что я делаю неправильно?

+0

Вы не правильно устанавливаете изображение в изображение, оно будет назначать изображение только в том случае, если изображение не содержит изображения иначе, если какое-то другое изображение уже назначено, оно приведет к этому. –

+0

что будет в другом случае? если у вас есть определенное требование, напишите, и все будет хорошо. –

ответ

0

Поскольку вы повторно используете ячейку, как только recipeImageView установлен, вы не перезаписываете ее - вы устанавливаете изображение только в том случае, если recipeImageView.image == nil, и это только при первом загрузке.

Вам нужно установить изображение с новым значением каждый раз, когда вы загружаете ячейку.

0

Я подозреваю, что причиной неправильного изображения является то, что условие if([recipeImageView image] == nil) возвращает false, когда предыдущая ячейка повторно используется. Когда предыдущая ячейка (ячейка в строке 1, например) повторно используется (в строке 10), она будет содержать и imageView с изображением (из строки 1), которое не равно нулю. Поэтому условие if выше возвращает false, а изображение (в строке 10) не будет обновляться новым изображением.

Предлагаемое решение: удалить условие if и всегда обновлять изображениеView новым изображением.

+0

Я добавил его, потому что с большим количеством изображений свиток становится немного жидким .. как я могу сохранить прокрутку жидкости? – Pol

+1

Вы можете загружать изображения в память на viewDidLoad и хранить объекты UIImage в массиве. Что замедляет прокрутку, так это то, что вы каждый раз загружаете изображения из файлов. Не забудьте очистить изображения, если didReceiveMemoryWarning вызывается на вашем UIViewController –

+0

@Pol, вы можете использовать изображения, которые точно соответствуют контейнеру фрейма, поскольку маленькие изображения будут загружаться быстрее (изображения большого пальца), или вы можете использовать асинхронную очередь для чтения ваших изображений в RAM до представляя – igrek

4

Если подкласс ваш UICollectionViewCell (вы действительно должны и переместить некоторые из этого кода из вашего контроллера вида), вы можете переопределить perpareForReuse и установить imageView.image = nil до ячейки снова используется.