可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I want my sections in the UICollectionView
to have a header with an image.
I have followed these steps:
- at the storyboard, assigned a header as an accessory for my
UICollectionView
- gave it an identifier
- created a subclass of
UICollectionReusableView
for it
- assigned the custom class to the class at the storyboard.
- put an
ImageView
at the header accessory
- made an outlet for the
ImageView
at the custom class in the .h
file
- Implemented the following at
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;
}
I know that the datasource and delegate methods are working because I can see all the cells and its sections. However, I don't have my headers. I put in a breakpoint at the method above and it's never being called.
What am i doing wrong?
回答1:
It seems that you have to give your header a non-zero size or collectionView:viewForSupplementaryElementOfKind:atIndexPath
isn't called. So either set the headerReferenceSize
property of the flow layout like so:
flowLayout.headerReferenceSize = CGSizeMake(self.collectionView.frame.size.width, 100.f);
or, implement collectionView:layout:referenceSizeForHeaderInSection
if you want to vary the size by section.
回答2:
You answered the question, but in words I understand better:
To make the method being called, add these methods:
- (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);
}
...and go from there.
回答3:
Swift 4 Xcode 9.1 Beta 2
Add @objc
@objc func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize{
let size = CGSize(width: 400, height: 50)
return size
}
Credits:
https://medium.com/@zonble/your-delegation-methods-might-not-be-called-in-swift-3-c6065ed7b4cd
回答4:
Did you add UICollectionViewDelegateFlowLayout in current interface? This worked for me.
@interface MyViewController () <UICollectionViewDelegateFlowLayout>
Swift:
class MyViewController: UICollectionViewDelegateFlowLayout {
回答5:
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)
}
回答6:
There is the swift version :
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 (version 7.3.1 ) does not propose these methods in autocomplete !
If you just want a header, just keep the header method.
回答7:
My problem was that in swift 3, the name of the viewForSupplementaryElementOfKind function has changed slightly from any posts that were on stack overflow. Hence, it was never getting called. Make sure that, if you're in swift 3, you're delegate function matches:
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {}
回答8:
I have the same issue. I have added referenceSizeForFooterInSection
but then also viewForSupplementaryElementOfKind
not getting called.
I have added this code in viewDidLoad()
and it worked for me:
if let flowLayout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
flowLayout.sectionFootersPinToVisibleBounds = true
}
回答9:
For me, in Swift 4.2, func collectionView(collectionView:kind:indexPath:) -> UICollectionReusableView was never being called. This was for a collection view in a UIViewController. I noticed the existing collection view functions were qualified with @objc, and that the UICollectionView had not adopted the UICollectionViewDataSource and UICollectionViewDelegate protocols. As soon as I adopted the protocols, I got errors that the collection view functions did not match the protocol. I corrected the function syntax, removed the qualifiers, and the section headers started working.
回答10:
@objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:)
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { }
The above code worked for me