Подтвердить что ты не робот

Разрешить просмотр заголовка только для определенных разделов с помощью iOS UICollectionView

В приведенном ниже коде отображается мое представление заголовка правильно, но для каждого из разделов в UICollectionView:

-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
          viewForSupplementaryElementOfKind:(NSString *)kind
                                atIndexPath:(NSIndexPath *)indexPath {
    UICollectionReusableView * headerView =
        [collectionView 
            dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader 
                               withReuseIdentifier:@"SectionHeaderCollectionReusableView"
                                      forIndexPath:indexPath];
    switch (indexPath.section) {
        case Section_One:
            return headerView;
        case Section_Two:
            return headerView;
        case Section_Three:
            return headerView;
        case Section_Four:
            return headerView;
        case Section_Five:
            return headerView;

        default:
            return headerView;
    }
}

Вместо этого я бы не отобразил представление заголовка для "Section_One" или "Section_Two", но при возврате "nil" приводит к "NSInternalInconsistencyException":

-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
          viewForSupplementaryElementOfKind:(NSString *)kind
                                atIndexPath:(NSIndexPath *)indexPath {
    UICollectionReusableView * headerView =
        [collectionView 
            dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader 
                               withReuseIdentifier:@"SectionHeaderCollectionReusableView"
                                      forIndexPath:indexPath];
    switch (indexPath.section) {
        case Section_One:
            return nil;
        case Section_Two:
            return nil;
        case Section_Three:
            return headerView;
        case Section_Four:
            return headerView;
        case Section_Five:
            return headerView;

        default:
            return nil;
    }
}

Что мне нужно сделать, чтобы отобразить представление заголовка только для определенных разделов?

4b9b3361

Ответ 1

Идем дальше и возвращаем заголовок для каждого раздела, а затем устанавливаем размер заголовка раздела, чтобы иметь нулевой размер в этой функции UICollectionViewDelegate.

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        return CGSizeZero;
    }else {
        return CGSizeMake(self.collectionView.bounds.size.width, desiredHeight);
    }
}

Ответ 2

У меня был случай с одним UICollectionViewController, управляющим двумя UICollectionView (упоминался позже как просмотр коллекции 1 и 2), и я хотел, чтобы заголовки были первыми, а не заголовки (или нижние колонтитулы) ко второму.

То, что отсутствует в ответе @mwright, заключается в том, что когда вы возвращаете CGSizeZero для представления коллекции 2 следующим образом:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
    if collectionView == self.collectionView2 {
        return CGSizeZero
    }
    return < something else >
}

... означает, что collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView не вообще не вызван для представления коллекции 2.

Это означает, что вам не нужно беспокоиться о возврате "неправильного" заголовка для второго представления коллекции впустую.

Ответ 3

Я заметил, что принятый ответ отклонил, когда вы использовали AutoLayout в XIB для заголовка многократного использования.

Это было особенно сложно, если вы отделили содержимое от краев или дали элементам внутри заголовка статический неизменный размер. Установка размера заголовка в CGSizeZero загромождала мою консоль отладчика десятками предупреждений от Interface Builder, говорящих, что они сломают все ограничения, чтобы соответствовать требованию, установленному в методе делегата.

Хотя это само по себе не является технически катастрофой, оно все еще грязно. И в эпоху Swift и AutoLayout должно быть более чистое решение. Кроме того, вы никогда не хотите отправлять такие вещи клиенту, когда вы на работе.

Чтобы исправить это, вместо простого вызова referenceSizeForHeaderInSection: и возврата CGSizeZero я создал другой подкласс UICollectionReusableView с XIB и установил высоту представления внутри него на 0.

Затем позже я удаляю этот вариант вне моего оператора switch, содержащегося в методе viewForSupplementaryElementOfKind. Это удовлетворяет как Interface Builder, так и визуальным требованиям! 🎉

Убивает сотни недопустимых предупреждений ограничений, напечатанных в консоли, пока вы отлаживаете.

Ответ 4

**

Если вы вернете значение размера (0, 0), заголовок не будет добавлен.

**

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {

 switch section {
 case 0:
   return CGSize(width: collectionView.bounds.width, height: 70)
 case 1:
   return CGSize(width: 0, height: 0) // NO HEADER WILL BE ADDED
 case 2:
   return CGSize(width: collectionView.bounds.width, height: 70)
 case 3:
   return CGSize(width: 0, height: 0) // NO HEADER WILL BE ADDED
 default:
   return CGSize(width: collectionView.bounds.width, height: 70)
 }

}

Ответ 5

Попробуйте вернуть пустой вид. Вероятно, лучший способ, но это может сработать...