2013-03-03 15 views
63

Quando provo a inserire UICollectionCell in UICollectionView in Interface Builder non riesco a metterlo con ragioni sconosciute. La cellula sta per la barra degli strumenti, senza l'aggiunta di UICollectionViewUICollectionView che aggiunge UICollectionCell

sto usando:

  • iOS SDK 6.0
  • XCode 4.5.1
  • Non faccio uso di Storyboard
+0

[Ecco una semplice soluzione] (http://stackoverflow.com/a/31735229/3681880) per creare un 'UICollectionViewCell' in un' UICollectionView'. – Suragch

risposta

130

Solo UICollectionView all'interno StoryBoard hanno UICollectionViewCell all'interno. Se si utilizza XIB, creare un nuovo XIB con CellName.xib, aggiungere CollectionViewCell ad esso, specificare il nome della classe personalizzata UICollectionView. Successivamente usa registerNib.

codice di esempio: https://github.com/lequysang/TestCollectionViewWithXIB

+0

@NAQ okay, come usi la tua classe? sicuro di aver registrato il pennino che è collegato a una classe, ma la classe initWithFrame non viene invocata. quindi se non potessi fare un po 'di stile aggiuntivo sulle tue prese xib su init. qual è il vantaggio di avere la classe MyCell in questo esempio? – topwik

+1

initWithFrame non funziona in nessuna cella Xib. Collega IBOutlet a MyCell.h e chiama altri metodi in awakeFromNib. –

+6

Sono sorpreso che Apple non sia stata così gentile da menzionarlo nella documentazione. -1 ora della mia vita. – expert

18

Non è possibile inserire UICollectionViewCell direttamente nello UiCollectionView se si utilizza il file Xib. È possibile solo nello storyboard. Aggiungi un UICollectionViewCell in un file Xib separato. Dai il tuo nome alla classe. Quindi registrare o classe o xib prima che la vista collezione appare

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

In genere questo viene fatto in viewDidLoad.

Questa è l'implementazione di un costume UICollectionViewCell senza l'uso di 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

cosa faresti se stai usando uno xib per il quale assegni una classe? Ho una classe UICollectionViewCell come classe personalizzata della mia cella xib. registroNib conNibName firCellWithResueIdentifier in viewDidLoad (anche in questo caso xib è collegato/connesso a una classe di celle). posso unire un layout xib con una personalizzazione extra fatta in codice usando la mia classe di cellulare? non sembra che il flusso lineare invocherà initWithFrame su una classe se si registra solo il pennino.devo registrare sia il pennino che la lezione con la mia vista collezione? – topwik

+0

@towpse sostituire initWithFrame per awakeFromNib in Cell.m. Non restituire –

+0

@towpse Ciò che il NAQ ha indicato è corretto. Registra il pennino. Quindi per la personalizzazione aggiuntiva usa initWithCoder o awakeFromNib della tua cella personalizzata (in cell.m) –

0

Va bene. Esiste davvero una soluzione per questo, se si desidera realmente avere la cella in collectionView all'interno del file xib dal generatore di interfacce:

  1. Creare uno storyboard.
  2. Creare UICollectionView e UICollectionViewCell dal builder dell'interfaccia.
  3. Regola l'interfaccia utente con i vincoli ecc. Per farlo apparire esattamente come desideri.
  4. Creare un nuovo file xib.
  5. Copia tutto lo storyboard nel nuovo file xib.

Funzionerà perfettamente.

  • Una cosa da tenere a mente che passo # 3 è molto importante, perché dopo # 5 non si dovrebbe per trascinare e scorrere l'UICollectionView, se lo fai, la cellula magicamente scompare! Oltre a questo, funzionerà perfettamente.
Problemi correlati