2013-12-13 5 views
1

У меня проблема с изображениями, которые не отображаются, даже если они загружаются. Я пробовал это несколько разных способов и тот же результат ... никаких изображений. Я получаю белые прямоугольники, размер и цвет которых указаны в раскадровке. Я получаю правильное количество прямоугольников в popover. Журнал показывает имена и идентификаторы правильно.UICollectionView изображения не отображаются

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

Моя цель iOS7. Запуск Xcode 5.0.2. Изображения поступают из базы данных SQL. Это живое приложение, которое я обновляю до полного iOS7 и где я заменяю пользовательскую схему сетки для UICollectionView. Использование CollectionViewController, встроенного в NavigationController, доступ к которому осуществляется через UIButton. Как вы можете видеть, нет пользовательской ячейки. Изображения должны отображаться в popover и затем выбираются пользователем для изменения фона основного представления.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"BckgndCell" forIndexPath:indexPath]; 

    NSDictionary * tempDict = [_arrayOfBckgnds objectAtIndex:indexPath.row]; 
    NSNumber *buttonTagNumber = (NSNumber *)[tempDict objectForKey:@"id"]; 
    int buttonTag = [buttonTagNumber intValue]; 
    NSString *tempImage = [tempDict objectForKey:@"fileName"]; 

    NSLog(@"Filename: %@", tempImage); 
    NSLog(@"ButtonTagNumber: %@", buttonTagNumber); 
    UIImageView *image = [[UIImageView alloc]init]; 
    image.image = [UIImage imageNamed:tempImage]; 
    NSLog(@"Image.image: %@", image.image); 

    // needed for selecting the background in didSelectItemAtIndexPath 
    _bgtag = buttonTag; 

    return cell; 
} 

Исправление который включает в себя собственно именования BackgroundCell (Дух) в методе cellForItemAtIndexPath и создание небольшой метод в контроллере BackgroundCell для установки изображения.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    BackgroundCell *cell = (BackgroundCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"BckgndCell" forIndexPath:indexPath]; 

    NSDictionary * tempDict = [_arrayOfBckgnds objectAtIndex:indexPath.row]; 
    NSNumber *buttonTagNumber = (NSNumber *)[tempDict objectForKey:@"id"]; 
    int buttonTag = [buttonTagNumber intValue]; 
    NSString *tempImage = [tempDict objectForKey:@"fileName"]; 

    [cell setImage:[UIImage imageNamed:tempImage]]; 

    // needed for selecting the background in didSelectItemAtIndexPath 
    _bgtag = buttonTag; 

    return cell; 
} 

Основной код ячейки;

- (id)initWithFrame:(CGRect)frame 
{ 
    _backgroundImage = [[UIImageView alloc] initWithFrame:self.contentView.bounds]; 

    [self.contentView addSubview:_backgroundImage]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

-(void)setImage:(UIImage *)image 
{ 
    _backgroundImage.image = image; 
} 
+0

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

ответ

4

Проблема в том, что изображение не установлено в иерархии представлений соты. Для этого подкласса UICollectionViewCell и создать imageView свойства в подклассе:

@interface CollectionViewCellSubclass : UICollectionViewCell 
@property (nonatomic, strong) UIImageView *imageView; 
@end 

... и инициализировать UIImageView в своем initWithFrame:

_imageView = [[UIImageView alloc] initWithFrame:self.contentView.bounds]; 
[self.contentView addSubview:_imageView]; 

Установите этот подкласс в качестве пользовательского класса для ячейки в раскадровке, а затем загрузить его в методе collectionView:cellForItemAtIndexPath выше установки изображения для изображения подвида клетки:

CollectionViewCellSubclass *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"BckgndCell" forIndexPath:indexPath]; 

//... 

cell.imageView.image = [UIImage imageNamed:tempImage]; 

Ho Это помогает.

+0

Это было близко, но не сигары. См. Исправление в основной области вопросов. –

+2

@MarcWatson ключевым моментом является то, что вы подклассифицировали 'UICollectionViewCell' и добавили' imageView' в свой contentView. Он должен был быть инициализирован в 'initWithFrame', поэтому я сделал редактирование выше. Суть ответа точна, хотя и, вероятно, поставила вас на правильном пути, поэтому, возможно, его стоит принять. –

1

Добавление cell.contentView.frame = [cell bounds] после того, как линия dequeueReusableCellWithReuseIdentifier работала для меня.

Предположим, вы добавили пользовательский (200,200) UICollectionViewCell через xib и изменили его фрейм где-то в коде, например. (120120). Вы должны соответствующим образом установить его ракурс представления контента, иначе изображение на его imageView (которое находится на его содержимом) не будет показано должным образом.

+0

Вы должны были разместить эту информацию как отредактировать свой ответ. Я отредактировал ваш комментарий в вашем ответе за вас. – Palec

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