3

Я пытаюсь сделать UICollectionView с клетками, которые пересекаются и частично накладываются друг на друга, как это делается на скриншоте: Layout 1 Этот макет был достигнут путем установкиIOS UICollectionViewCells Компоновка с пересечением

self.minimumLineSpacing = -100; 

в моем UICollectionViewFlowLayout подкласса , Когда я прокручиваю вниз, все в порядке. Я вижу, чего хочу. Но когда я прокручиваю вверх, я вижу другое поведение, а не то, что я ожидал: Layout 2 Итак, мой вопрос: как я могу сделать свой макет так, как на первом экране, независимо от направления просмотра прокрутки. Примечание: Я должен поддерживать как iOS 6, так и 7.

Большое спасибо за любые советы и помощь.

ответ

1

Нашли еще одно решение, чтобы решить эту проблему. Нам нужно использовать подкласс UICollectionViewFlowLayout.

@interface MyFlowLayout : UICollectionViewFlowLayout 
@end 

@implementation MyFlowLayout 

- (void)prepareLayout { 
    [super prepareLayout]; 
    // This allows us to make intersection and overlapping 
    self.minimumLineSpacing = -100; 
} 

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    NSArray *layoutAttributes = [super layoutAttributesForElementsInRect:rect]; 
    for (UICollectionViewLayoutAttributes *currentLayoutAttributes in layoutAttributes) { 
     // Change zIndex allows us to change not only visible position, but logic too 
     currentLayoutAttributes.zIndex = currentLayoutAttributes.indexPath.row; 
    } 
    return layoutAttributes; 
} 

@end 

Надеюсь, что это поможет кому-то еще.

2

Хм, интересно. Поскольку просмотр коллекции перерабатывает ячейки, они постоянно добавляются и удаляются из иерархии представлений, когда они перемещаются и выходят из экрана. Говоря это, это разумно, и когда они снова добавляются в представление, они просто добавляются в виде подпунктов, что означает, что когда ячейка перерабатывается, теперь она имеет самый высокий индекс z всех ячеек.

Один из способов устранения неполадок для этого заключается в том, чтобы вручную отрегулировать положение z каждой ячейки, чтобы быть поэтапно выше с помощью указательного пути. Таким образом, нижние (y) ячейки всегда будут отображаться над (z) клетками выше (y).

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellID = @"CELLID"; 

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath]; 

    if (cell.layer.zPosition != indexPath.row) { 
     [cell.layer setZPosition:indexPath.row]; 
    } 

    return cell; 
} 
+0

Отлично! Большое спасибо. Кажется, он работает, как я хочу! –

+0

@AccidBright Рад, что это помогло! –

+0

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

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