Provare ad aggiungere una vista supplementare al mio UICollectionView
come intestazione. Sto avendo problemi per farlo funzionare.UICollectionView e visualizzazione supplementare (intestazione)
Io uso una consuetudine UICollectionViewFlowLayout
per restituire un contentSize
che è sempre almeno 1 pixel più grande allora il telaio (sto usando un UIFreshControl
che funziona solo se le UICollectionView
pergamene e impostare collectionView.contentSize
non fa direttamente nulla) ea invalidateLayout
su sectionInsert
e itemSize
modifiche:
-(void)setSectionInset:(UIEdgeInsets)sectionInset {
if (UIEdgeInsetsEqualToEdgeInsets(super.sectionInset, sectionInset)) {
return;
}
super.sectionInset = sectionInset;
[self invalidateLayout];
}
-(void) setItemSize:(CGSize)itemSize {
if (CGSizeEqualToSize(super.itemSize, itemSize)) {
return;
}
super.itemSize = itemSize;
[self invalidateLayout];
}
- (CGSize)collectionViewContentSize
{
CGFloat height = [super collectionViewContentSize].height;
// Always returns a contentSize larger then frame so it can scroll and UIRefreshControl will work
if (height < self.collectionView.bounds.size.height) {
height = self.collectionView.bounds.size.height + 1;
}
return CGSizeMake([super collectionViewContentSize].width, height);
}
ho creato una classe UICollectionReusableView
che è solo un UIView
con un UILabel
:
@implementation CollectionHeaderView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CollectionHeaderView" owner:self options:nil];
if ([arrayOfViews count] < 1) {
return nil;
}
if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) {
return nil;
}
self = [arrayOfViews objectAtIndex:0];
self.headerLabel.text = @"This is a header. There are many like it.";
self.backgroundColor = [UIColor yellowColor];
}
return self;
}
Cercando per la sua attuazione:
DatasetLayout *collectionViewFlowLayout = [[DatasetLayout alloc] init];
collectionViewFlowLayout.itemSize = CGSizeMake(360, 160);
collectionViewFlowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
collectionViewFlowLayout.sectionInset = UIEdgeInsetsMake(16, 16, 16, 16);
collectionViewFlowLayout.minimumInteritemSpacing = 16;
collectionViewFlowLayout.minimumLineSpacing = 16;
collectionViewFlowLayout.headerReferenceSize = CGSizeMake(0, 100);
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:collectionViewFlowLayout];
collectionView.translatesAutoresizingMaskIntoConstraints = FALSE;
collectionView.backgroundColor = [UIColor yellowColor];
collectionView.delegate = self;
collectionView.dataSource = self;
mi registro di classe:
[self.collectionView registerClass:[CollectionHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"CollectionHeaderView"];
e attuare il delegato:
-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
CollectionHeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"CollectionHeaderView" forIndexPath:indexPath];
headerView.headerLabel.text = @"Blarg!";
return headerView;
}
La linea
collectionViewFlowLayout.headerReferenceSize = CGSizeMake(0, 100);
causa l'errore:
Se commento fuori, corre ma nessuna intestazione.
Cosa sto facendo male o non sto implementando?
L'errore si sta lamentando del fatto che "UICollectionView dataSource non è impostato". ** - collectionView: viewForSupplementaryElementOfKind: atIndexPath: ** è, in effetti, un metodo di protocollo dell'origine dati non un metodo di protocollo delegato. Hai la proprietà ** dataSource ** del set di viste dell'insieme? –
Non sono esattamente sicuro di cosa intendi con "la proprietà dataSource dell'insieme di viste dell'insieme?"? Ho un dataSource e viene visualizzato se non tento di fare un'intestazione. – Padin215
L'oggetto UICollectionView ha una proprietà dataSource.L'errore che stai ricevendo sta dicendo che non lo hai impostato sull'oggetto che implementerà lo - collectionView: viewForSupplementaryElementOfKind: atIndexPath: metodo –