我在UIScrollView
制作了无限滚动日历,每个日历最多可包含8个子视图。我在scrollViewDidScroll()
内调用的函数看起来像这样(简化):
func addAndRemoveRow(scrollView: UIScrollView) {
if scrollView.contentOffset.y - scrollViewZeroOffsetY < -heightOfDay/2 { // Going back in time.
createRowAtBottom()
removeRowAtTop()
} else if scrollView.contentOffset.y - scrollViewZeroOffsetY > heightOfDay/2 { // Going forward in time.
createRowAtTop()
removeRowAtBottom()
}
}
从功能上讲,这种方法非常有效,并且在每行包含一天的模式下,即使在我的iPhone 5上也可以顺畅运行(两种模式在模拟器上流畅运行)。但是,在每行包含一周的模式中,它非常不稳定。
每次滚动视图移动一个像素时,调用addAndRemoveRow()
似乎有点过分。有没有办法不经常调用它?
(或者,有更优化的方法吗?我尝试使用UICollectionView
并且它不能更顺利地运行。)
答案 0 :(得分:1)
我很好奇为什么UICollectionView没有帮助。我在屏幕上同时拥有100个单元格的collectionView,即使在5年代也运行得很顺利。
如果您仍然拥有collectionView的实现,我会检查一些事情是否有助于您的表现:
1:确保您正在重复使用单元格,并确保您的数据源不会动态更改,除非它也需要。另外,如果您要在awakeFromNib
中向单元格添加更多子视图,而不是在配置时,请确保并在可能的情况下重复使用更改。
2:如果启动时存在延迟,请使用估计的大小,假设您使用的是iOS8 +和流量布局@property (nonatomic) CGSize estimatedItemSize NS_AVAILABLE_IOS(8_0);
3:如果你没有使用流布局,请确保只为- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect;
返回正确数量的布局属性。你应该只返回rect中任何内容的属性。< / p>
4:尽量不要使边界上的布局无效,以确定它是否有助于提高性能。
如果你在视图中做更多动态的事情,这是一个很好的阅读:http://www.raizlabs.com/2013/10/animating-items-uicollectionview-2/