由于iOS 7上的UICollectionView
存在问题,这篇文章(可能是愚蠢的)经过了8个小时的g at my my monkey monkey monkey monkey monkey monkey monkey monkey <<
我已经将UICollectionViewFlowLayout
子类化为我的UICollectionView dataSource的所有50个部分提供了一个通用的“Section X”(Sticky Header)[其中X是一个数字]标题,这是一个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上,这个问题不存在。标题似乎在整个卷轴中出列并正确显示,没有任何丝毫问题。
任何人都可以帮助我,或者在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;
答案 0 :(得分:8)
我解决了我的问题。事实证明,在iOS 7里面
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
你绝不能设置补充视图的框架。留下适当的委托方法。
我的天啊。 17个小时后,我去睡觉 。