Представление заголовка не перестраивается после прокрутки в UICollectionView

У меня есть UICollectionView, который расширяется при нажатии на ячейку, и после заполнения экрана он становится прокручиваемым.

Теперь, когда я прокручиваю вниз, мне нужно, чтобы мой заголовок прокручивался вместе с ним, и для этого я реализовал логику в методе layoutAttributesForSupplementaryViewOfKind в своем пользовательском классе UICollectionViewLayout.

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

Но после этого, если я выполняю любое другое действие, например касание сотовой связи, оно упорядочивается должным образом.

Я пробовал вызывать setNeedsLayout, setNeedsDisplay и layoutSubviews, где я перезагружаю свой UICollectionView, но заголовок по-прежнему не обновляется до своего правильного положения.

Ниже приведен код моего метода layoutAttributesForSupplementaryViewOfKind.

Любая помощь приветствуется.

- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {

    if (![kind isEqualToString:[myGridHeaderView kind]]) {
        return nil;
    }

    myGridHeaderPosition headerPosition = [[self collectionView] headerPositionAtIndexPath:indexPath];
    CGRect cellRect = [[self delegate] getRectForHeaderAtIndex:indexPath headerPosition:headerPosition];

    if (CGRectEqualToRect(cellRect, CGRectZero)) {
        return nil;
    }

    myGridHeaderLayoutAttribute* attributes = [myGridHeaderLayoutAttribute layoutAttributesForSupplementaryViewOfKind:kind withIndexPath:indexPath];

    CGPoint centerPoint = CGPointMake(CGRectGetMidX(cellRect), CGRectGetMidY(cellRect));
    CGSize  size        = cellRect.size;


    UICollectionView * const cv = self.collectionView;

    NSInteger zIndex = 1;
    CGPoint const contentOffset = cv.contentOffset;

    if (contentOffset.x > 0)
    {
        if (headerPosition != myGridHeaderPositionColumn)
        {
            centerPoint.x += contentOffset.x;
        }
        zIndex = 1005;
    }
    if (contentOffset.y > 0)
    {
        if (headerPosition != myGridHeaderPositionRow)
        {
            centerPoint.y += contentOffset.y;
        }
        zIndex = 1005;
    }
    if (headerPosition == myGridHeaderPositionCommon) {
        zIndex = 1024;
    }
    attributes.zIndex = zIndex;
    attributes.headerPosition = headerPosition;
    attributes.center = centerPoint;
    attributes.size = size;
    attributes.alpha = 1.0;

    return attributes;

}

person sonu    schedule 19.06.2018    source источник


Ответы (1)


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

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    isScrollingStart=YES;
    NSLog(@"scrollViewDidScroll  %f , %f",scrollView.contentOffset.x,scrollView.contentOffset.y);


    if (scrollView.contentOffset.y<=124) {
        _img_top_header.alpha=scrollView.contentOffset.y/124;
    }
    else
    {
        _img_top_header.alpha=1.0;
    }



}

необходимо установить изображение в заголовке.

person Khushal iOS    schedule 20.06.2018
comment
В моем случае заголовок всегда виден, это неправильная позиция. Когда я проверяю журнал, атрибут возвращает правильный кадр, но он по-прежнему не позиционируется правильно в представлении коллекции, пока не будет выполнено какое-либо другое действие в представлении коллекции. - person sonu; 20.06.2018