gpt4 book ai didi

ios - UICollectionView 中只有一个粘性 header

转载 作者:可可西里 更新时间:2023-11-01 05:29:08 25 4
gpt4 key购买 nike

我正在尝试在 UICollectionView 中实现单个粘性 header 。

我的粘性 header 行为与您看到的常见行为有点不同,例如在 UITableView 中。我在 Collection View 中有 3 个标题,我只希望其中一个是粘性的,并在内容滚动时粘在顶部。

我的代码运行良好。但是,当我向下滚动时,粘性标题有时会突然消失。向后滚动会使标题再次出现。我究竟做错了什么?

我附上了自定义布局的实现。它是 UICollectionViewFlowLayout 的子类。

@implementation CustomFlowLayout


- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSMutableArray *attributes = [[super layoutAttributesForElementsInRect:rect] mutableCopy];
CGPoint const contentOffset = self.collectionView.contentOffset;

for (UICollectionViewLayoutAttributes *layoutAttributes in attributes)
{
// Adjust the sticky header frame.
if ([layoutAttributes.representedElementKind isEqualToString:UICollectionElementKindSectionHeader] &&
layoutAttributes.indexPath.section == SectionWithStickyHeadeIndex)
{
NSInteger numberOfItemsInSection = [self.collectionView numberOfItemsInSection:SectionWithStickyHeadeIndex];
NSIndexPath *firstObjectIndexPath = [NSIndexPath indexPathForItem:0
inSection:SectionWithStickyHeadeIndex];
UICollectionViewLayoutAttributes *firstObjectAttrs;

if (numberOfItemsInSection > 0)
{
firstObjectAttrs = [self layoutAttributesForItemAtIndexPath:firstObjectIndexPath];
}
else
{
firstObjectAttrs = [self layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader
atIndexPath:firstObjectIndexPath];
}

CGPoint origin = layoutAttributes.frame.origin;

// Adjust the header origin so it sticks to the top.
origin.y = MAX(contentOffset.y + self.collectionView.contentInset.top,
CGRectGetMinY(firstObjectAttrs.frame) - CGRectGetHeight(layoutAttributes.frame));

layoutAttributes.zIndex = CGFLOAT_MAX;
layoutAttributes.frame = (CGRect)
{
.origin = origin,
.size = layoutAttributes.frame.size
};

break;
}
}

return attributes;
}


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


@end

最佳答案

我对此不是 100% 确定,但看起来一旦您向下滚动足够远,标题的原始位置就不再位于 rect 参数内。这导致 header 的布局属性不包含在您在 for 循环中迭代的 attributes 数组中,导致布局位置不再调整到其“粘性” "位于屏幕顶部。

尝试在 for 循环之前添加这些行,以将粘性 header 的布局属性添加到 attributes 数组(如果它们尚不存在):

NSIndexPath *stickyHeaderIndexPath = [NSIndexPath indexPathForItem:0 inSection:SectionWithStickyHeaderIndex];
UICollectionViewLayoutAttributes *layoutAttributes = [self layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader
atIndexPath:stickyHeaderIndexPath];
if (![attributes containsObject:layoutAttributes])
{
[attributes addObject:layoutAttributes];
}

关于ios - UICollectionView 中只有一个粘性 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23499189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com