UICollectionView部分标题闪烁问题

时间:2014-01-30 12:03:29

标签: ios objective-c ios7 uicollectionview uicollectionviewlayout

由于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;

1 个答案:

答案 0 :(得分:8)

我解决了我的问题。事实证明,在iOS 7里面

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

绝不能设置补充视图的框架。留下适当的委托方法。

我的天啊。 17个小时后,我睡觉