Разрешить просмотр заголовка только для определенных разделов с помощью 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;
}
}
Что мне нужно сделать, чтобы отобразить представление заголовка только для определенных разделов?
Ответы
Ответ 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
Попробуйте вернуть пустой вид. Вероятно, лучший способ, но это может сработать...