Создание настраиваемого вида просмотра коллекций

Я пытаюсь создать представление коллекции, похожее на схему ниже. Элемент центра всегда будет иметь "фокус" и быть больше, его довольно немного напоминает концепцию потока покрытия:

http://s13.postimg.org/n6vzil213/layout_schematic.png

Я могу добиться этого с помощью UICollectionViewFlowLayout, но я хочу, чтобы нижняя ячейка (3) увеличивалась, а средняя ячейка (2) уменьшалась при прокрутке? Я предполагаю, что мне нужно выполнить некоторую математику с помощью методов делегата прокрутки.

Любая идея о том, как достичь этого?

1 ответ

Вы можете сделать это только с помощью подкласса UICollectionViewFlowLayout.

Вот шаги:

  1. Создайте подкласс UICollectionViewFlowLayout
  2. Переопределить shouldInvalidateLayoutForBoundsChange: и вернуть ДА
  3. Переопределить layoutAttributesForElementsInRect: и layoutAttributesForItemAtIndexPath :. Вызовите супер-реализацию, чтобы получить стандартные значения FlowLayout.
  4. Создайте метод, который вызовет оба метода из шага №3, которые меняют атрибуты макета элементов на основе их расстояния от центра центра просмотра коллекций. Используйте математику, чтобы установить правильное преобразование ItemsSize/transform/3D для элементов.

Здесь очень грубый пример, который делает то, что вы ищете, без правильной математики.

@implementation MMLayout

-(CGSize)itemSize
{
 return CGSizeMake(200.0f, 200.0f);
}

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
 return YES;
}

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

 for (UICollectionViewLayoutAttributes *atts in attributes) {
 [self scaleForPositionOfAttributes:atts];
 }

 return attributes;
}

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath;
{
 UICollectionViewLayoutAttributes *atts = [super layoutAttributesForItemAtIndexPath:indexPath];

 [self scaleForPositionOfAttributes:atts];

 return atts;
}

- (void)scaleForPositionOfAttributes:(UICollectionViewLayoutAttributes *)attributes
{
 CGFloat collectionViewHeight = CGRectGetHeight(self.collectionView.bounds);
 CGFloat collectionViewCenter = collectionViewHeight / 2.0f;

 CGFloat scaleForCenter = ABS(collectionViewCenter - (attributes.frame.origin.y - self.collectionView.contentOffset.y)) < 50.0f ? 1.3f : 0.7f;
 attributes.size = CGSizeMake(200.0f * scaleForCenter, 200.0f * scaleForCenter);
}

@end

licensed under cc by-sa 3.0 with attribution.