11

Se ho capito bene, il contenuto di un UICollectionViewCell deve passare all'interno della sua proprietà contentView e dello sfondo in backgroundView.Definizione di UICollectionViewCell con pennino

Tuttavia, quando trascino un UICollectionViewCell in Interface Builder non si fa menzione di contentView o backgroundView. Se aggiungo le visualizzazioni secondarie, quelle avranno l'intera cella come genitore, non contentView o backgroundView.

Qual è il modo corretto di definire uno UICollectionViewCell con IB, quindi?

risposta

14

"Se posso aggiungere subviews, quelli avranno tutta la cella come padre, non contentView"

Questo non è vero. Se trascini un UICollectionViewCell e aggiungi elementi dell'interfaccia utente, lo stai aggiungendo alla visualizzazione del contenuto. Il fatto che non compaia nell'elenco degli oggetti non significa che non ci sia (lo stesso è vero per NSBox - ha una vista dei contenuti che non compare nemmeno in IB). Se in collectionView: didSelectItemAtIndexPath:, si registra cellForItemAtIndexPath, e si guardano le sue subviews, ne trova solo una, ed è la stessa che si ottiene registrando cell.contentView. Se registri le sue sottoview, vedrai i tuoi elementi dell'interfaccia utente.

Ora, per quanto riguarda la vista di sfondo, non penso che sia qualcosa a cui puoi accedere da IB. È possibile avere un file xib con un UIView e quindi assegnarlo alla proprietà backgroundView della cella.

+2

Half-true. Avevo provato prima e non ha funzionato. Tuttavia, avevo trascinato un UIView e cambiato il tipo in una sottoclasse UICollectionViewCell. Funziona solo se fai esattamente quello che hai detto: trascina un UIColllectionViewCell dalla libreria e modifica il tipo. Molto hacky. – hpique

+1

@hpique, è necessario iniziare con il tipo corretto di oggetto prima di creare una sottoclasse.Iniziando con UICollectionViewCell, si ottengono tutte le proprietà e i dati predefiniti, che non si ottengono con un UIView: non c'è nulla di hacky in questo. – rdelmar

+0

Non funziona perché il 'contentView' è implicito. Dal momento che non riesco a vederlo, non potrei sapere senza prove ed errori che iniziare con un tipo o l'altro fa la differenza. – hpique

7

Per mancanza di un'opzione migliore, sto utilizzando file di pennini separati per contentView e backgroundView. Poi nel mio UICollectionViewCell sottoclasse:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     NSArray *contentViewNib = [[NSBundle mainBundle] loadNibNamed:@"CollectionViewCellContentView" owner:self options:nil]; 
     [self.contentView addSubview:contentViewNib[0]]; 
     NSArray *backgroundViewNib = [[NSBundle mainBundle] loadNibNamed:@"CollectionViewCellBackgroundView" owner:self options:nil]; 
     self.backgroundView = backgroundViewNib[0]; 
    } 
    return self; 
} 
+0

quindi stai solo registrando la tua classe con la vista di raccolta e quindi caricando i tuoi xib su initWithFrame della classe di celle? – topwik

+0

sei quindi in grado di accedere a qualsiasi presa che potresti aver impostato sul tuo xib tramite codice? – topwik

+1

farlo in questo modo, per quanto posso dire finora, va bene solo se non si pianifica di modificare alcun contenuto di quegli xib. non avresti contenuto dinamico, etichette o campi di testo che cambiano per cella in quei xibs, vero? – topwik

0

Non sono sicuro se questo è nuovo per Xcode 8 ma UICollectionViewCell include prese per il collegamento di backgroundView e selectedBackgroundView.

enter image description here

Grazie a questo, è possibile aggiungere un UIView (o sottoclasse) per la vostra collezione di cellule vista e collegarlo a uno dei due punti vendita. In questo modo sarai in grado di definirli usando IB.

enter image description here

Spero che questo aiuti!

Problemi correlati