2013-03-03 7 views
63

Когда я пытаюсь поставить UICollectionCell на UICollectionView в Interface Builder Я не могу поместить его по неизвестным причинам. Клетка собирается панели инструментов без добавления UICollectionViewUICollectionView добавление UICollectionCell

Я использую:

  • IOS SDK 6,0
  • XCode 4.5.1
  • Я не использую Раскадровка
+0

[Это простое пошаговое руководство] (http://stackoverflow.com/a/31735229/3681880) для создания 'UICollectionViewCell' в' UICollectionView'. – Suragch

ответ

130

Только UICollectionView внутри раскадровке имеют UICollectionViewCell внутри. Если вы используете XIB, создайте новый XIB с CellName.xib, добавьте в него CollectionViewCell, укажите имя пользовательского класса UICollectionView. После этого используйте registerNib.

Пример кода: https://github.com/lequysang/TestCollectionViewWithXIB

+0

@NAQ хорошо, как вы используете свой класс? убедитесь, что вы зарегистрировали свой ниб, который связан с классом, но класс initWithFrame не вызывается. поэтому, если вы не можете сделать какой-то дополнительный стиль в своих xib-выходах в init. в чем преимущество использования класса MyCell в этом примере? – topwik

+1

initWithFrame не работает ни в одной ячейке Xib. Подключите IBOutlet к MyCell.h и вызовите другие методы в awakeFromNib. –

+6

Я удивлен, что Apple не была достаточно любезна, чтобы упомянуть об этом в документации. -1 час моей жизни. – expert

18

Вы не можете положить UICollectionViewCell непосредственно в UiCollectionView, если вы используете файл Xib. Его возможно только в раскадровке. Добавьте UICollectionViewCell в отдельный файл Xib. Дайте свое имя класса. Затем зарегистрировать либо класс или XIB перед вид коллекции появляется

[self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:CELL_ID]; 

Обычно это делается в viewDidLoad.

Это реализация пользовательских UICollectionViewCell с с использованием Xib

@implementation CollectionViewCell 
@synthesize imageView = _imageView; 

- (id)initWithFrame:(CGRect)frame 
{ 
self = [super initWithFrame:frame]; 
if (self) { 

    self.backgroundColor = [UIColor whiteColor]; 
    self.layer.shadowColor = [UIColor blackColor].CGColor; 
    self.layer.shadowRadius = 5.0f; 
    self.layer.shadowOffset = CGSizeMake(2.0f, 2.0f); 
    self.layer.shadowOpacity = 0.5f; 

    // Selected background view 
    UIView *backgroundView = [[UIView alloc]initWithFrame:self.bounds]; 
    backgroundView.layer.borderColor = [[UIColor colorWithRed:0.529 green:0.808 blue:0.922 alpha:1]CGColor]; 
    backgroundView.layer.borderWidth = 10.0f; 
    self.selectedBackgroundView = backgroundView; 

    // set content view 
    CGRect frame = CGRectMake(self.bounds.origin.x+5, self.bounds.origin.y+5, self.bounds.size.width-10, self.bounds.size.height-10); 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame]; 
    self.imageView = imageView;   
    [imageView release]; 
    self.imageView.contentMode = UIViewContentModeScaleAspectFill ; 
    self.imageView.clipsToBounds = YES; 
    [self.contentView addSubview:self.imageView];  

} 
return self; 
} 
+0

Что бы вы сделали, если используете xib, для которого вы назначаете класс? У меня есть класс UICollectionViewCell как пользовательский класс моей ячейки xib. i registerNib withNibName firCellWithResueIdentifier в viewDidLoad (снова xib связан/связан с классом ячейки). Можно ли комбинировать xib-макет с дополнительной настройкой, выполненной в коде, используя мой класс ячеек? это не похоже, что прямой поток вызовет initWithFrame для класса, если вы просто зарегистрируете nib.мне нужно зарегистрировать как nib, так и класс с моим представлением коллекции? – topwik

+0

@towpse заменить initWithFrame на awakeFromNib в Cell.m. Не возвращайте –

+0

@towpse Что говорит NAQ правильно. Зарегистрируйте нить. Затем для дополнительной настройки используйте initWithCoder или awakeFromNib вашей пользовательской ячейки (в cell.m) –

0

Хорошо. На самом деле существует обходное решение для этого, если вы действительно хотите, чтобы ячейка в коллекцииView внутри xib-файла была построена из интерфейса:

  1. Создайте раскадровку.
  2. Создайте UICollectionView и UICollectionViewCell от конструктора интерфейса.
  3. Отрегулируйте пользовательский интерфейс с ограничениями и т. Д., Чтобы он выглядел именно так, как вы хотели.
  4. Создайте новый xib-файл.
  5. Скопируйте все внутри раскадровки в новый xib-файл.

Будет работать отлично.

  • Одна вещь, чтобы иметь в виду, что шаг # 3 очень важно, потому что после # 5 вы не должны перетаскивать и перемещаться по UICollectionView, если вы это сделаете, то клетка волшебным образом исчезнет! Кроме этого, он будет работать отлично.
Смежные вопросы