UICollectionView et vue supplémentaire (en-tête)
D'essayer d'ajouter un Supplémentaire en vue de mon UICollectionView
comme un en-tête. Je vais avoir des questions à la faire fonctionner.
- Je utiliser un custom UICollectionViewFlowLayout
retour d'un contentSize
qui est toujours au moins 1 pixel la taille de l'image (je suis à l'aide d'un UIFreshControl
qui ne fonctionne que si le UICollectionView
parchemins, et la mise collectionView.contentSize
directement ne fait rien) et à invalidateLayout
sur sectionInsert
et itemSize
changements:
-(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);
}
J'ai créé un UICollectionReusableView
classe qui est juste un UIView
avec 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;
}
En essayant de le mettre en œuvre:
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;
- Je m'inscrire à la classe:
[self.collectionView registerClass:[CollectionHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"CollectionHeaderView"];
et de mettre en œuvre le délégué:
-(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 ligne
collectionViewFlowLayout.headerReferenceSize = CGSizeMake(0, 100);
provoque l'erreur:
*** Assertion failure in -[UICollectionView _createPreparedSupplementaryViewForElementOfKind:atIndexPath:withLayoutAttributes:], /SourceCache/UIKit_Sim/UIKit-2380.17/UICollectionView.m:1150
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView dataSource is not set'
Si j'en commentaire, il fonctionne, mais pas d'en-tête.
Ce que je fais mal ou de ne pas mettre en œuvre?
source d'informationauteur Padin215
Vous devez vous connecter pour publier un commentaire.
Je pose le même problème, mais mon application s'est écrasé après le I du programme, pop mon UICollectionViewController. Dans certaines raison (je pense que c'est juste un bug dans le SDK) de soi.collectionView était vivant après son " contrôleur de détruire, donc la cause de cette défaillance:
La solution est simplement de remplacer -dealloc dans UICollectionViewController et la libération de soi.collectionView manuellement. ARC code:
Espère que ce sera du temps de gagner pour quelqu'un.
Les réponses à ce sujet sont assez anciennes, et ne fonctionnent pas dans iOS8 et iOS9. Si vous rencontrez toujours le problème décrit, consultez la rubrique suivante: UICollectionView et Complémentaire en Vue de crash
MODIFIER:
Voici la réponse, au cas où le lien devient invalide:
Si vous utilisez la mise en page personnalisée de votre collection de la vue, de vérifier si son de la source de données est nul en:
Le résultat devrait ressembler à quelque chose comme ceci:
Ce changement résout le problème suivant:
Vous pouvez également consulter la rubrique suivante, cependant, il ne résout rien dans mon cas:
Supprimant l'espace vide, si l'en-tête de section est caché dans le UICollectionView
Espère que ça va vous aider, et vous ne perdrez pas autant de temps que je l'ai fait.
J'ai nettoyé mon code et enlevé le UICollectionView j'avais créé à l'IB et l'a créé dans le code. J'ai couru le nouveau et a obtenu une autre erreur et réalisé que je n'avais pas mis le délégué ou la source de données de l'IB. J'ai fait:
Mais qui ne doit pas avoir été assez bon.
Donc, avec UICollectionView créé au bureau de l'IB et de ne pas fixer de la delgate/source de données de l'IB, mais plutôt dans le code:
a été un problème. J'ai refait pour créer la UICollectionView tous dans code:
et j'ai une autre erreur:
que je vais essayer de comprendre.
EDIT:
compris, j'ai été l'enregistrement de l'en-tête de manière incorrecte:
passé à:
et tout fonctionne. Pas entièrement sûr de savoir comment les
registerClass:
ne fonctionnait pas bien.Si vous regardez le message d'erreur, il est dit que la source de données n'est pas définie. Cela devrait corriger le problème:
self.collectionView.dataSource = self;
Assurez-vous que votre vue-contrôleur met en œuvre la source de données de protocole:
YourViewController : UIViewController<UICollectionViewDataSource>
Cette réponse est semblable aux autres où vous créez une méthode qui vérifie la présence de la source de données, mais il est un peu plus simple. Il semble que le problème est lié à l'affichage de la collection de la mise en page pour rester dans les parages après le recueil a été publié. J'ai donc mis à zéro, la mise en page de propriétés comme ci-dessous et l'erreur a disparu.
J'ai aussi eu cette fâcheuse erreur:
et j'ai trouvé des gens en train de résoudre cette erreur en faisant
ou swift:
cependant aucune de ces résolu mon accident.
J'ai essayé un peu les choses et les "hack" résolu ce bug gênant:
J'ai eu le même problème et, de même, je n'étais pas de l'inscription de l'en-tête correctement. il y a plusieurs fils sur ici que suggérer à l'aide d'une Plume de définir l'en-tête mais je l'ai fait différemment et fonctionne bien.
J'ai un en-tête personnalisé SizeCollectionHeader, qui hérite de la UICollectionReusableView. Elle est enregistrée comme ça.
et fonctionne bien.
mon problème initial était celui qui avait un hasard "Genre" de la valeur de ce genre.
Cette panne.
Donc, je voulais juste commenter pour quelqu'un qui est à la recherche ici que vous n'avez pas besoin d'utiliser une plume.
Essayez ceci :
Il a travaillé pour moi 😉
J'ai continué à obtenir la même erreur. J'avais mis en place le CustomHeaderView pour mon collectionView. J'ai eu de la classe de la Collection Réutilisables Vue de mon CustomHeaderView et j'avais mis de l'identificateur. J'ai 1/2 heure à essayer de comprendre pourquoi cela a été un échec.
Vous avez besoin de lire les journaux soigneusement...leçon apprise.
La raison en est que Dans le storyboard - dans le collectionView Identité de l'Inspecteur, j'avais vérifié les deux Accessoires: en-Tête de Section et de la Section de Pied de page. J'ai seulement besoin de la section d'en-tête. Il suffit de décocher le pied de page...construire et exécuter..BOUM!
Un iOS9 bug, Dans le viewcontroller de dealloc ensemble de la couche de délégué néant.