我想创建一个能容纳不同大小等的“意见”对于这个我使用这些细胞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问题。 从我读这已经在滚动过程中与细胞的重装做。 什么是防止正确的方法是什么?
值得注意的是,内容是动态的,这是非常重要的。 用户应该能够添加并在运行时取出卡片。
谢谢
你在你使用的是评论说CHTCollectionViewWaterFallLayout
。 我用它自己的应用程序,并从性能角度看,这是不是最佳的(我检查的源代码,现在,关键点仍然是相同的)。 我不得不做一些调整,以得到它顺利。
首先,如果你的目标的iOS 8.0及以上 ,已作出巨大的改进UICollectionView
,你绝对应该确保尽可能使用。 2014年WWDC的视频是什么表的新的和集合视图为您提供了一个很好的概述。 关键的一点是,iOS的8增加了三种新的方法来UICollectionViewLayoutInvalidationContext
:
- invalidateItemsAtIndexPaths:
- invalidateSupplementaryElementsOfKind:atIndexPaths:
- invalidateDecorationElementsOfKind:atIndexPaths:
使用这些方法连同UICollectionViewLayout invalidationContextForBoundsChange:
您可以缩小你的布局需要处理的项目极其量。 这会给你一个最佳的性能。
如果像我一样,你也需要定位到iOS 7,事情变得更加复杂。 有你的布局两个关键方法,您可以改进:
- 首先,
shouldInvalidateLayoutForBoundsChange:
在这里你调查改变了界限,并确保您只失效在绝对必要的完整布局。 - 其次,
prepareLayout
,它应该被称为只有在完整的布局应是无效的。
就我而言,我不得不添加浮动头,所以我设置一个属性shouldInvalidateAll
在shouldInvalidateLayoutForBoundsChange:
我在检查prepareLayout
知道我是否真的需要从头开始准备布局。
它实际上不是那么容易(但有可能)得到它顺利,但我希望这为您的版本,以提高起点。
你可以继承集合观察室,当它的创建,而不是每次它被重新执行一次全层初始化。
此外,重用这样的小区时,你应该检查一下现在小区已经加入了Card
。 当复用,据我所知的iOS不会自动删除添加子视图(所以重用细胞addSubview可以用不同的卡多次执行,你可以检查这个观点与调试)。
您也可以延迟加载的单元格内容。
正如我可以从代码中了解,每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];
我有点理解了它。 我的一些卡包含图像,每次我会滚动系统将重新从内存中的所有这些图像。 这使得滚动相对缓慢和波动。