gpt4 book ai didi

ios - UICollectionView 部分标题闪烁问题

转载 作者:可可西里 更新时间:2023-11-01 05:12:44 30 4
gpt4 key购买 nike

由于 iOS 7 上的 UICollectionView 问题,我像傻猴一样对着电脑连续 8 小时目瞪口呆后,这篇文章(也许是愚蠢的)出现了。

我对 UICollectionViewFlowLayout 进行了子类化,以便为我的 UICollectionView 数据源的所有 50 个部分提供一个通用的“Section X”(Sticky Header)[其中 X 是一个数字] header ,这是一个 NSArray 分区。

我在我的子类中调用 - (NSArray *) layoutAttributesForElementsInRect:(CGRect)rect {,它确实显示了标题,但只显示了第一部分。这是非常奇怪的行为。我期望的是:

|S| [CELL] [CELL] |S| [CELL] [CELL] 
|E| [ ] [ ] |E| [ ] [ ]
|C| [____] [____] |C| [____] [____]
|T| |T|
| | [CELL] [CELL] | | [CELL]
| | [ ] [ ] | | [ ]
|1| [____] [____] |2| [____]

“SECT 2” 是第一个部分之后的下一个部分标题,当用户水平滚动(同样适用于垂直滚动)时,它应该在屏幕上可见,但是什么我得到的是:

|S| [CELL] [CELL] | | [CELL] [CELL] 
|E| [ ] [ ] | | [ ] [ ]
|C| [____] [____] | | [____] [____]
|T| | |
| | [CELL] [CELL] | | [CELL]
| | [ ] [ ] | | [ ]
|2| [____] [____] | | [____]

第一个节标题后的空白节标题,以及第二个节标题的位置错误。当我滚动 UICollectionView 时,这一切都会改变。错误位置的第二个消失了,但它也没有去到它应该去的地方。

稍微滚动之后:

|S| [CELL] [CELL] | | [CELL] [CELL] 
|E| [ ] [ ] | | [ ] [ ]
|C| [____] [____] | | [____] [____]
|T| | |
| | [CELL] [CELL] | | [CELL]
| | [ ] [ ] | | [ ]
|1| [____] [____] | | [____]

第 1 节之后仍然是空白。

在我实际滚动到该部分的开头之前,在 UICollectionView 中实际上没有任何部分标题是可见的。它没有滚动到位,而是出现在正确的位置,没有任何动画。我一直滚动,结果是一样的。

我已经在没有我的 UICollectionViewFlowLayout 子类的情况下测试了这种行为,并且只是在屏幕上粘贴了一个通用的 UIView 。在 iOS 6 上不存在此问题。 header 似乎在整个滚动过程中出队并正确显示,没有任何问题。

任何人都可以帮助我,或者其他人在 iOS 7 上给 UICollectionView 部分标题时遇到这个问题吗?我快疯了!!

layoutAttributesForElementsInRect: 方法

    - (NSArray *) layoutAttributesForElementsInRect:(CGRect)rect {

NSMutableArray *answer = [[super layoutAttributesForElementsInRect:rect] mutableCopy];
UICollectionView * const cv = self.collectionView;
CGPoint const contentOffset = cv.contentOffset;

NSMutableIndexSet *missingSections = [NSMutableIndexSet indexSet];
for (UICollectionViewLayoutAttributes *layoutAttributes in answer) {
if (layoutAttributes.representedElementCategory == UICollectionElementCategoryCell) {
[missingSections addIndex:layoutAttributes.indexPath.section];
}
}
for (UICollectionViewLayoutAttributes *layoutAttributes in answer) {
if ([layoutAttributes.representedElementKind isEqualToString:UICollectionElementKindSectionHeader]) {
[missingSections removeIndex:layoutAttributes.indexPath.section];
}
}

[missingSections enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {

NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:idx];

UICollectionViewLayoutAttributes *layoutAttributes = [self layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader atIndexPath:indexPath];

[answer addObject:layoutAttributes];

}];

for (UICollectionViewLayoutAttributes *layoutAttributes in answer) {

if ([layoutAttributes.representedElementKind isEqualToString:UICollectionElementKindSectionHeader]) {

NSInteger section = layoutAttributes.indexPath.section;
NSInteger numberOfItemsInSection = [cv numberOfItemsInSection:section];

NSIndexPath *firstCellIndexPath = [NSIndexPath indexPathForItem:0 inSection:section];
NSIndexPath *lastCellIndexPath = [NSIndexPath indexPathForItem:MAX(0, (numberOfItemsInSection - 1)) inSection:section];

UICollectionViewLayoutAttributes *firstCellAttrs = [self layoutAttributesForItemAtIndexPath:firstCellIndexPath];
UICollectionViewLayoutAttributes *lastCellAttrs = [self layoutAttributesForItemAtIndexPath:lastCellIndexPath];

CGFloat headerWidth = CGRectGetWidth(layoutAttributes.frame);
CGPoint origin = layoutAttributes.frame.origin;
origin.x = MIN(MAX(contentOffset.x, (CGRectGetMinX(firstCellAttrs.frame) - headerWidth)),
(CGRectGetMaxX(lastCellAttrs.frame) - headerWidth)
);

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

}

}

return answer;

}

viewForSupplementaryElementOfKind:相关代码:

CollectionHeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:
UICollectionElementKindSectionHeader withReuseIdentifier:CellIdentifier forIndexPath:indexPath];

headerView.frame = CGRectMake(0, 0, 60, sectionContainerView.frame.size.height);
[headerView setBackgroundColor:[UIColor greenColor]]; //to test visibility
return headerView;

最佳答案

我解决了我的问题。原来在iOS 7里面

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{

绝不能设置补充 View 的框架。将其留给适当的委托(delegate)方法。

我的天哪。 17 小时后,我 sleep

关于ios - UICollectionView 部分标题闪烁问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21456044/

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