Chcę, aby moje sekcje UICollectionView
miały nagłówek z obrazem.
Wykonałem następujące kroki:
- w scenorysie przypisano nagłówek jako dodatek do mojego
UICollectionView
- nadał mu identyfikator
- utworzył
UICollectionReusableView
dla niego podklasę - przypisał klasę niestandardową do klasy w scenorysie.
- umieścić
ImageView
na akcesorium nagłówka - stworzył ujście dla
ImageView
klasy niestandardowej w.h
pliku - Wdrożono w
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;
}
Wiem, że metody źródła danych i delegata działają, ponieważ widzę wszystkie komórki i ich sekcje. Jednak nie mam swoich nagłówków. W powyższej metodzie wstawiłem punkt przerwania i nigdy nie jest on wywoływany.
Co ja robię źle?
ios
uicollectionview
Eden V.
źródło
źródło
kind == UICollectionElementKindSectionHeader
do ciągów zamiast zawartości łańcuchów, prawdopodobnie chcesz użyć[kind isEqualToString: UICollectionElementKindSectionHeader]
zamiast tego.Odpowiedzi:
Wygląda na to, że musisz nadać nagłówkowi niezerowy rozmiar lub
collectionView:viewForSupplementaryElementOfKind:atIndexPath
nie jest wywoływany. Więc albo ustawheaderReferenceSize
właściwość układu przepływu w następujący sposób:flowLayout.headerReferenceSize = CGSizeMake(self.collectionView.frame.size.width, 100.f);
Swift 5+
flowLayout.headerReferenceSize = CGSize(CGSize(width: self.collectionView.frame.size.width, height: 100))
lub zastosuj,
collectionView:layout:referenceSizeForHeaderInSection
jeśli chcesz zmieniać rozmiar według sekcji.źródło
headerReferenceSize
działa, ale potrzebuję różnych rozmiarów dla różnych sekcji. A metoda, którą podałeś, nie jest w ogóle wywoływanaOdpowiedziałeś na pytanie, ale słowami rozumiem lepiej:
Aby wywołać metodę, dodaj następujące metody:
- (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); }
... i idź stamtąd.
źródło
Swift 4 Xcode 9.1 Beta 2
Dodaj @objc
@objc func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize{ let size = CGSize(width: 400, height: 50) return size }
Kredyty: https://medium.com/@zonble/your-delegation-methods-might-not-be-called-in-swift-3-c6065ed7b4cd
źródło
Czy dodałeś UICollectionViewDelegateFlowLayout w bieżącym interfejsie? To zadziałało dla mnie.
@interface MyViewController () <UICollectionViewDelegateFlowLayout>
Szybki:
class MyViewController: UICollectionViewDelegateFlowLayout {
źródło
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) }
źródło
Jest szybka wersja:
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 (wersja 7.3.1) nie proponuje tych metod w autouzupełnianiu!
Jeśli potrzebujesz tylko nagłówka, po prostu zachowaj metodę header.
źródło
@objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:) func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { }
Powyższy kod zadziałał dla mnie
źródło
Mój problem polegał na tym, że w swift 3 nazwa funkcji viewForSupplementaryElementOfKind zmieniła się nieznacznie w stosunku do wszystkich postów, które były przepełnione. Dlatego nigdy nie było wywoływane. Upewnij się, że jeśli jesteś w Swift 3, jesteś dopasowany do funkcji delegowanej:
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {}
źródło
Mam ten sam problem. Dodałem,
referenceSizeForFooterInSection
ale potem teżviewForSupplementaryElementOfKind
nie otrzymałem wezwania. Dodałem ten kod wviewDidLoad()
i zadziałał:if let flowLayout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout { flowLayout.sectionFootersPinToVisibleBounds = true }
źródło
Dla mnie w Swift 4.2 func collectionView (collectionView: kind: indexPath :) -> UICollectionReusableView nigdy nie była wywoływana. To było dla widoku kolekcji w UIViewController. Zauważyłem, że istniejące funkcje widoku kolekcji zostały zakwalifikowane za pomocą @objc i że UICollectionView nie przyjął protokołów UICollectionViewDataSource i UICollectionViewDelegate. Jak tylko zaadoptowałem protokoły, otrzymałem błąd, że funkcje widoku kolekcji nie pasują do protokołu. Poprawiłem składnię funkcji, usunąłem kwalifikatory i nagłówki sekcji zaczęły działać.
źródło
Jeśli masz podklasę ogólną, musisz zadbać o określenie nazwy metody delegata ObjC, jeśli jest inna niż nazwa Swift ( https://bugs.swift.org/browse/SR-2817 ).
@objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:) func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { ...
źródło