Ich möchte, dass meine Abschnitte in der UICollectionView
einen Header mit einem Bild haben.
Ich habe diese Schritte befolgt:
- am Storyboard einen Header als Zubehör für meine zugewiesen
UICollectionView
- gab ihm eine Kennung
- hat eine Unterklasse
UICollectionReusableView
dafür erstellt - Die benutzerdefinierte Klasse wurde der Klasse im Storyboard zugewiesen.
- Setzen Sie ein
ImageView
am Header-Zubehör - machte einen Ausgang für die
ImageView
an der benutzerdefinierten Klasse in der.h
Datei - Implementierte Folgendes bei
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;
}
Ich weiß, dass die Datenquellen- und Delegatenmethoden funktionieren, da ich alle Zellen und ihre Abschnitte sehen kann. Ich habe jedoch keine Header. Ich habe bei der obigen Methode einen Haltepunkt eingefügt, der nie aufgerufen wird.
Was mache ich falsch?
ios
uicollectionview
Eden V.
quelle
quelle
kind == UICollectionElementKindSectionHeader
anstelle des Inhalts der Zeichenfolgen vergleichen , die Sie wahrscheinlich[kind isEqualToString: UICollectionElementKindSectionHeader]
stattdessen verwenden möchten .Antworten:
Es scheint, dass Sie Ihrem Header eine Größe ungleich Null geben müssen oder
collectionView:viewForSupplementaryElementOfKind:atIndexPath
nicht aufgerufen werden. Stellen Sie also entweder dieheaderReferenceSize
Eigenschaft des Ablauflayouts wie folgt ein:flowLayout.headerReferenceSize = CGSizeMake(self.collectionView.frame.size.width, 100.f);
Swift 5+
flowLayout.headerReferenceSize = CGSize(CGSize(width: self.collectionView.frame.size.width, height: 100))
oder implementieren
collectionView:layout:referenceSizeForHeaderInSection
Sie , wenn Sie die Größe nach Abschnitten variieren möchten.quelle
headerReferenceSize
funktioniert, aber ich brauche verschiedene Größen für verschiedene Abschnitte. Und die von Ihnen angegebene Methode wird überhaupt nicht aufgerufenSie haben die Frage beantwortet, aber in Worten verstehe ich besser:
Fügen Sie die folgenden Methoden hinzu, um die aufgerufene Methode zu erstellen:
- (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); }
... und geh von dort aus.
quelle
Swift 4 Xcode 9.1 Beta 2
Fügen Sie @objc hinzu
@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
quelle
Haben Sie UICollectionViewDelegateFlowLayout in der aktuellen Benutzeroberfläche hinzugefügt? Das hat bei mir funktioniert.
@interface MyViewController () <UICollectionViewDelegateFlowLayout>
Schnell:
class MyViewController: UICollectionViewDelegateFlowLayout {
quelle
UICollectionViewDelegateFlowLayout
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) }
quelle
Es gibt die schnelle 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) schlägt diese Methoden nicht in Autocomplete vor!
Wenn Sie nur einen Header möchten, behalten Sie einfach die Header-Methode bei.
quelle
@objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:) func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { }
Der obige Code hat bei mir funktioniert
quelle
Mein Problem war, dass sich in Swift 3 der Name der Funktion viewForSupplementaryElementOfKind gegenüber allen Posts, die sich im Stapelüberlauf befanden, geringfügig geändert hat. Daher wurde es nie angerufen. Stellen Sie sicher, dass Sie, wenn Sie in Swift 3 sind, Funktionsübereinstimmungen delegieren:
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {}
quelle
Ich habe das gleiche Problem. Ich habe hinzugefügt,
referenceSizeForFooterInSection
aber dann auchviewForSupplementaryElementOfKind
nicht angerufen. Ich habe diesen Code hinzugefügtviewDidLoad()
und es hat bei mir funktioniert:if let flowLayout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout { flowLayout.sectionFootersPinToVisibleBounds = true }
quelle
In Swift 4.2 wurde func collectionView (collectionView: kind: indexPath :) -> UICollectionReusableView nie aufgerufen. Dies war für eine Sammlungsansicht in einem UIViewController. Ich habe festgestellt, dass die vorhandenen Funktionen der Sammlungsansicht mit @objc qualifiziert wurden und dass UICollectionView die Protokolle UICollectionViewDataSource und UICollectionViewDelegate nicht übernommen hat. Sobald ich die Protokolle übernommen habe, wurde die Fehlermeldung angezeigt, dass die Funktionen der Sammlungsansicht nicht mit dem Protokoll übereinstimmen. Ich habe die Funktionssyntax korrigiert, die Qualifikationsmerkmale entfernt und die Abschnittsüberschriften haben funktioniert.
quelle
Wenn Sie eine generische Unterklasse haben, müssen Sie darauf achten, den Namen der ObjC-Delegatmethode anzugeben, wenn dieser vom Swift-Namen abweicht ( https://bugs.swift.org/browse/SR-2817 ).
@objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:) func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { ...
quelle