2014-02-12 3 views
12

У меня есть UICollectionView. Я хотел бы добавить заголовок. Мой заголовок будет только UILabel. Я:Добавить простой UIView как заголовок UICollectionView

1) выбрал «Заголовок секции» в качестве аксессуара для коллекции в IB.

2) создан коллекционный многоразовый вид в IB, со стороны, объявленный как collectionViewHeader.

3) добавили эти строки:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 
{ 
    if (kind == UICollectionElementKindSectionHeader) { 

      return collectionViewHeader; 
    } 
    return nil; 
} 

Но они никогда не называют.

Должен ли я создать класс только для этого лейбла, чтобы использовать

[self.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"]; 

?

Почему это не так просто, как UITableView, где вы просто перетаскиваете любой заголовок, который хотите?! Все настолько сложно с UICollectionView ...

ответ

13

Если вы не установите заголовок в раскадровке, вам придется его зарегистрировать.

В viewDidLoad:

- (void)viewDidLoad 
{ 
    [self.collectionView registerClass:[YourOwnSubClass class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView"]; 
} 

Но в любом случае, вам придется подкласс UICollectionReusableView.

@interface YourOwnSubClass : UICollectionReusableView 

затем:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView 
      viewForSupplementaryElementOfKind:(NSString *)kind 
           atIndexPath:(NSIndexPath *)indexPath 
{ 

    YourOwnSubClass *headerView = [collectionView dequeueReusableSupplementaryViewOfKind: 
             UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];  
    [self updateSectionHeader:headerView forIndexPath:indexPath]; 

    return headerView; 
} 

- (void)updateSectionHeader:(UICollectionReusableView *)header forIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *text = [NSString stringWithFormat:@"header #%i", indexPath.row]; 
    header.label.text = text; 
} 
+1

Thank-х за ваш ответ. К сожалению, коллекцияView: viewForSupplementaryElementOfKind: atIndexPath не вызывается. И знаете, как добавить наконечник в YourOwnSubClass? –

+0

то, может быть, вы забыли настроить себя как делегата? Что это значит? добавить ноб как подвью? или инициализировать YourOwnSubClass от nib? – Raz

+0

Делегат установлен, все остальное отлично работает:/Я имею в виду инициализировать YourOwnSubClass от nib, так как это UICollectionReusableView. –

12

В стрижа, как показано ниже

Регистрация Заголовок Просмотр

collectionView.registerClass(HeaderView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "headerView") 

В UICollectionViewDelegate

func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { 

    let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: "headerView", forIndexPath: indexPath) 

    headerView.frame.size.height = 100 

    return headerView 
} 

Важно то, что вы предоставить макет потока с размером заголовка

flowLayout.headerReferenceSize = CGSize(width: self.collectionView.height, height: 100) 

В противном случае метод делегата не дозвонились

4

Просто добавьте вид на UICollectionView и изменить insets

collectionView.addSubview(headerView) 
collectionView.contentInset.top = 300 

headerView.frame = CGRect(x: 0, 
          y: -300, 
          width: collectionView.frame.size.width, 
          height: 300) 
+3

это похоже на взлом –

+1

@RayTso Мы просто добавляем представление к другому виду. Я вижу, что это делается во многих приложениях – onmyway133

Смежные вопросы