我希望UICollectionView
中的我的部分有一个带图像的标题。
我已按照以下步骤操作:
UICollectionView
UICollectionReusableView
的子类ImageView
ImageView
文件.h
创建了一个出口
viewDidLoad
[self.collectionView registerClass:[ScheduleHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier];
-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
UICollectionReusableView *reusableview = nil;
if (kind == UICollectionElementKindSectionHeader)
{
ScheduleHeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier forIndexPath:indexPath];
headerView.headerImageView.image = [UIImage imageNamed:@"blah.png"];
reusableview = headerView;
}
return reusableview;
}
我知道数据源和委托方法正在运行,因为我可以看到所有单元格及其部分。但是,我没有我的标题。我在上面的方法中设置了一个断点,它永远不会被调用。
我做错了什么?
答案 0 :(得分:166)
似乎您必须为标头指定非零大小,否则不会调用collectionView:viewForSupplementaryElementOfKind:atIndexPath
。因此,要么像这样设置流布局的headerReferenceSize
属性:
flowLayout.headerReferenceSize = CGSizeMake(self.collectionView.frame.size.width, 100.f);
或者,如果您想按部分更改大小,请实施collectionView:layout:referenceSizeForHeaderInSection
。
答案 1 :(得分:29)
你回答了这个问题,但我用更好的理解:
要调用该方法,请添加以下方法:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
return CGSizeMake(60.0f, 30.0f);
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section {
return CGSizeMake(60.0f, 30.0f);
}
......从那里开始。
答案 2 :(得分:19)
Swift 4 Xcode 9.1 Beta 2
添加@objc
@objc func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize{
let size = CGSize(width: 400, height: 50)
return size
}
现金: https://medium.com/@zonble/your-delegation-methods-might-not-be-called-in-swift-3-c6065ed7b4cd
答案 3 :(得分:10)
您是否在当前界面中添加了UICollectionViewDelegateFlowLayout?这对我有用。
@interface MyViewController () <UICollectionViewDelegateFlowLayout>
夫特:
class MyViewController:UICollectionViewDelegateFlowLayout {
答案 4 :(得分:7)
Swift 3.0(xcode 8.2.1)
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
return CGSize(width:collectionView.frame.size.width, height:30.0)
}
答案 5 :(得分:5)
有快速版本:
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
let size = CGSize(width: 400, height: 50)
return size
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
let size = CGSize(width: 400, height: 50)
return size
}
XCode(版本7.3.1)不建议在自动完成中使用这些方法!
如果您只想要一个标题,请保留标题方法。
答案 6 :(得分:3)
@objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:)
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { }
上面的代码对我有用
答案 7 :(得分:2)
我的问题是在swift 3中,viewForSupplementaryElementOfKind函数的名称与堆栈溢出的任何帖子略有不同。因此,它永远不会被召唤。如果你在swift 3中,请确保你是委托功能匹配:
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {}
答案 8 :(得分:1)
我有同样的问题。我添加了 referenceSizeForFooterInSection
,但后来又没有 viewForSupplementaryElementOfKind
被打来。
我已将此代码添加到viewDidLoad()
中,并且对我有用:
if let flowLayout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
flowLayout.sectionFootersPinToVisibleBounds = true
}
答案 9 :(得分:1)
斯威夫特 5 轻松简单的方式
您的代码中仅缺少这两行,您就可以完成
在任何地方使用这些行
let layout = self.colv.collectionViewLayout as! UICollectionViewFlowLayout
layout.headerReferenceSize = CGSize(width: self.colv.frame.size.width, height: 100)
我在
中使用这些行func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let CellCount = CGFloat(3.0)
let width = CGFloat(collectionView.frame.size.width/CellCount)
//let height = CGFloat(collectionView.frame.size.height)
let layout = self.colv.collectionViewLayout as! UICollectionViewFlowLayout
layout.headerReferenceSize = CGSize(width: self.colv.frame.size.width, height: 100)
return CGSize(width: width, height: width+10)
}
答案 10 :(得分:0)
对我来说,在Swift 4.2中,func collectionView(collectionView:kind:indexPath :)->从未调用过UICollectionReusableView。这是针对UIViewController中的集合视图的。我注意到现有的集合视图函数已使用@objc进行了限定,并且UICollectionView没有采用UICollectionViewDataSource和UICollectionViewDelegate协议。一旦采用了协议,我就会收到错误,认为集合视图功能与协议不匹配。我更正了函数语法,删除了限定符,并且节标题开始起作用。
答案 11 :(得分:0)
如果您有通用子类,则必须注意指定ObjC委托方法名称 如果它不同于Swift名称(https://bugs.swift.org/browse/SR-2817)。
@objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:)
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
...