在UICollectionView中滚动后,标题视图未重新排列

时间:2018-06-19 17:38:17

标签: ios objective-c uicollectionview uicollectionviewlayout xcode9.3

我有一个UICollectionView,它在单击一个单元格时会扩展,一旦屏幕填满,它将变为可滚动。

现在,当我向下滚动时,我需要标题视图向下滚动,为此,我已经在自定义layoutAttributesForSupplementaryViewOfKind类的UICollectionViewLayout方法中实现了逻辑。

这很好用,但是现在的问题是,当我使内容可滚动并且向下滚动几个单元格并立即单击一个单元格以将内容缩小到一个屏幕时,此时标题视图没有被排列,即它仍然保持在最后一个滚动位置。

但是在那之后,如果我执行其他任何操作(例如,点击单元格),它将得到正确安排。

我尝试调用setNeedsLayoutsetNeedsDisplaylayoutSubviews,在其中我重新加载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;

}

1 个答案:

答案 0 :(得分:0)

上下滚动时,将显示和隐藏标题,以供使用此代码。

- (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;
    }



}

必须在标题中设置图片。