UICollectionView跳跃滚动(UICollectionView jumpy scroll

2019-10-22 07:47发布

我想创建一个能容纳不同大小等的“意见”对于这个我使用这些细胞UICollectionView的界面:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    Card *card = [[[usermanager getSelectedUser] getCards] objectAtIndex:indexPath.item];
    UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cardCell" forIndexPath:indexPath];
    [cell addSubview:card];

    [cell.layer setBorderColor:[UIColor redColor].CGColor];
    [cell.layer setBorderWidth:1.0f];
    [cell.layer setMasksToBounds:NO];
    return cell;
}

寄托都似乎很好地工作,直到卡量变得太大,我必须滚动。 视图跳一点点,当我举起我的手指滚动后。 我也得到其他一些奇怪的UI问题。 从我读这已经在滚动过程中与细胞的重装做。 什么是防止正确的方法是什么?

值得注意的是,内容是动态的,这是非常重要的。 用户应该能够添加并在运行时取出卡片。

谢谢

Answer 1:

你在你使用的是评论说CHTCollectionViewWaterFallLayout 。 我用它自己的应用程序,并从性能角度看,这是不是最佳的(我检查的源代码,现在,关键点仍然是相同的)。 我不得不做一些调整,以得到它顺利。

首先,如果你的目标的iOS 8.0及以上 ,已作出巨大的改进UICollectionView ,你绝对应该确保尽可能使用。 2014年WWDC的视频是什么表的新的和集合视图为您提供了一个很好的概述。 关键的一点是,iOS的8增加了三种新的方法来UICollectionViewLayoutInvalidationContext

- invalidateItemsAtIndexPaths:
- invalidateSupplementaryElementsOfKind:atIndexPaths:
- invalidateDecorationElementsOfKind:atIndexPaths:

使用这些方法连同UICollectionViewLayout invalidationContextForBoundsChange:您可以缩小你的布局需要处理的项目极其量。 这会给你一个最佳的性能。

如果像我一样,你也需要定位到iOS 7,事情变得更加复杂。 有你的布局两个关键方法,您可以改进:

  • 首先, shouldInvalidateLayoutForBoundsChange:在这里你调查改变了界限,并确保您只失效在绝对必要的完整布局。
  • 其次, prepareLayout ,它应该被称为只有在完整的布局应是无效的。

就我而言,我不得不添加浮动头,所以我设置一个属性shouldInvalidateAllshouldInvalidateLayoutForBoundsChange:我在检查prepareLayout知道我是否真的需要从头开始准备布局。

它实际上不是那么容易(但有可能)得到它顺利,但我希望这为您的版本,以提高起点。



Answer 2:

你可以继承集合观察室,当它的创建,而不是每次它被重新执行一次全层初始化。

此外,重用这样的小区时,你应该检查一下现在小区已经加入了Card 。 当复用,据我所知的iOS不会自动删除添加子视图(所以重用细胞addSubview可以用不同的卡多次执行,你可以检查这个观点与调试)。

您也可以延迟加载的单元格内容。



Answer 3:

正如我可以从代码中了解,每cellForItemAtIndexPath叫你正在一个新的卡对象,将其作为细胞上的子视图。

您还没有实际使用复用电池的功率。 尝试在细胞(故事板或XIB无论你正在使用)添加UI元素。 然后基于该索引路径上的那些元素的值。 这将消除滞后滚动。

也导入<QuartzCore/QuartzCore.h>

[cell.layer setShadowPath:[[UIBezierPath
                            bezierPathWithRect:self.bounds] CGPath]];

[cell.layer setBorderColor:[UIColor redColor].CGColor];    
[cell.layer setBorderWidth:1.0f];
[cell.layer setMasksToBounds:NO];


Answer 4:

我有点理解了它。 我的一些卡包含图像,每次我会滚动系统将重新从内存中的所有这些图像。 这使得滚动相对缓慢和波动。



文章来源: UICollectionView jumpy scrolling