我正在开发一个使用UICollectionView
来展示几张专辑的项目。项目显示正常,但现在我想在第一部分上方显示标题。
为此,我将registerNib:forSupplementaryViewOfKind:withReuseIdentifier:
添加到我的init方法中。像这样:
[self.collectionView registerNib:[UINib nibWithNibName:@"AlbumHeader" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kAlbumHeaderIdentifier];
(AlbumHeader
Nib包含类AlbumHeader
的视图,它是UICollectionView
的子类。)
之后,我实施了collectionView:viewForSupplementaryElementOfKind:atIndexPath
方法:
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
return [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:kAlbumHeaderIdentifier forIndexPath:indexPath];
}
现在它应该尝试加载标题视图,我想。但事实并非如此,补充视图的方法不会被调用。
我错过了什么?坚持几个小时,已多次阅读UICollectionView
s上的文档,但似乎没有任何帮助。有什么想法吗?
在查找yuf询问的方法后,我读到默认情况下页眉/页脚的大小是0,0。如果大小为0,则不显示页眉/页脚。
您可以使用属性设置大小:
flowLayout.headerReferenceSize = CGSizeMake(0, 100);
然后所有标题将具有相同的大小。如果每个部分必须不同,则可以实现以下方法,该方法是UICollectionViewDelegateFlowLayout
协议的一部分。
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
if (section == albumSection) {
return CGSizeMake(0, 100);
}
return CGSizeZero;
}
请注意,在垂直滚动中,它使用返回的height
和集合视图的整个宽度,在水平滚动时,它使用返回width
和集合视图的完整高度。
你实施了:
- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
有很多方法可以实现,只是为了让一件事工作......我也在学习。告诉我它是否有效。
编辑:抱歉错误的方法。那是我认为的子类化。我正在讨论的是UICollectionViewLayout
(你的子类的布局对象,如果你的布局支持补充视图):
- layoutAttributesForSupplementaryViewOfKind:atIndexPath:
适用于SWIFT 3和SWIFT 4
self.collectionView.register(UINib(nibName: "SectionCollectionReusableView", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "SectionCollectionReusableView")
self.collectionView.fs_width = self.collectionView.bounds.width
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 70, left: 40, bottom: 0, right: 0)
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 0
layout.estimatedItemSize = CGSize(width: 350, height: 140)
layout.scrollDirection = .horizontal
layout.headerReferenceSize = CGSize(width: self.collectionView.bounds.size.width, height: 60)
layout.sectionHeadersPinToVisibleBounds = true
self.collectionView!.collectionViewLayout = layout
你必须将它添加到ViewDidLoad,并注意到
layout.headerReferenceSize = CGSize(width: self.collectionView.bounds.size.width, height: 60)
这将使标题部分布局
并感谢@Guido Hendriks,我也从他们的答案中获得了洞察力