0

У меня довольно стандартная сетка, используя подкласс UICollectionViewFlowLayout. Когда пользователь удаляет ячейку, я перемещаю ячейки в последующих строках вниз, чтобы создать пространство для подробного представления, которое появится. Это выглядит следующим образом:Несколько дополнительных видов в UICollectionViewFlowLayout?

grid mockup

В этой точке зрения подробно я хочу показать другой вид с соответствующими данными, подобно тому, как ITunes показывает album details. В существующем макете есть заголовки для каждого раздела, и я в настоящее время удаляю подробный вид на место, вручную управляя позицией фрейма. Это становится сложно с поворотами и клетками.

Как я могу убедить макет для обработки позиции детали, рассматривая ее как дополнительный вид? Мой контроллер настроен правильно, чтобы отобразить деталь как дополнительный вид, такой же для макета.

ответ

1

Решает проблему. В общих чертах, вот что работает для меня:

  1. Создать подкласс UICollectionViewLayoutAttributes и зарегистрировать его в макете с помощью переопределения функции layoutAttributesClass.
  2. В layoutAttributesForElementsInRect: получить все стандартные атрибуты макета с помощью [super layoutAttributesForElementsInRect:rect];.
  3. Скопируйте этот массив в изменяемый массив и добавить еще один набор атрибутов для дополнительного зрения делать что-то вроде [attributesCopy addObject:[self layoutAttributesForSupplementaryViewOfKind:YourSupplementaryKind atIndexPath:indexPathForTappedCell]];
  4. В layoutAttributesForSupplementaryViewOfKind:atIndexPath: получить атрибуты для вашего зрения с чем-то вроде YourLayoutAttributes *attributes = [YourLayoutAttributes layoutAttributesForSupplementaryViewOfKind:elementKind withIndexPath:indexPath];
  5. Теста, что elementKind соответствует типу дополнительного зрения вы хотите создать
  6. Получить расположение ячейки атрибутов с использованием [self layoutAttributesForItemAtIndexPath:indexPath];
  7. Измените кадр из атрибутов клеточных, чтобы удовлетворить потребности вашего дополнительного зрения
  8. Назначить новый кадр для дополнительных атрибутов

Важной частью отметить, вы не можете пропустить подклассовUICollectionViewLayoutAttributes. Выполнение запроса super (пример UICollectionViewFlowLayout) для атрибутов дополнительного вида для чего угодно, кроме стандартных верхних или нижних колонтитул, вернет nil. Я не мог найти какую-либо конкретную документацию по этому поведению, поэтому я могу ошибаться, но, по моему опыту, это были подклассовые атрибуты, которые решают мои проблемы.

Ваш код должен выглядеть следующим образом:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    NSArray *allAttributesInRect = [super layoutAttributesForElementsInRect:rect]; 
    NSMutableArray *attributes = NSMutableArray.array; 

    for (UICollectionViewLayoutAttributes *cellAttributes in allAttributesInRect) 
    { 
     // Do things with regular cells and supplemental views 
    } 

    if (self.selectedCellPath) 
    { 
     UICollectionViewLayoutAttributes *detailAttributes = [self layoutAttributesForSupplementaryViewOfKind:SomeLayoutSupplimentaryDetailView atIndexPath:self.selectedCellPath]; 
     [attributes addObject:detailAttributes]; 
    } 

    return attributes.copy; 
} 


- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath 
{ 
    SomeLayoutAttributes *attributes = [SomeLayoutAttributes layoutAttributesForSupplementaryViewOfKind:elementKind withIndexPath:indexPath]; 

    if ([elementKind isEqualToString:SomeLayoutSupplimentaryDetailView]) 
    { 
     UICollectionViewLayoutAttributes *cellAttributes = [self layoutAttributesForItemAtIndexPath:indexPath]; 
     CGRect frame = cellAttributes.frame; 

     frame.size.width = CGRectGetWidth(self.collectionView.frame); // or whatever works for you 
     attributes.frame = frame; 
    } 

    return attributes; 
} 

Ваш UICollectionViewLayoutAttributes подкласс не обязательно нужны никакие дополнительные свойства или функции, но это отличное место для хранения данных, специфичных для этой точки зрения для использования конфигурации после извлечения вид с использованием dequeueReusableSupplementaryViewOfKind:forIndexPath:.

+0

Эй, можем ли мы поговорить? Пишите мне [email protected] Я работаю над библиотекой и могу заниматься своими знаниями. Он имеет отношение к заголовкам столбцов для раздела 0. В настоящее время я могу только один дополнительный метод вызвать один раз для раздела 0, оставив мне только один заголовок столбца lol. – Pavan

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