ios - 有没有更有效的方法来检测 UIScrollView 偏移量?

标签 ios swift uiscrollview

我在 UIScrollView 中制作了一个无限滚动的日历,其中每个最多可以包含八个 subview 。我在 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 上它也能流畅运行(两种模式在模拟器上运行流畅)。然而,在每行包含一周的模式下,它非常不稳定。

每次 ScrollView 移动一个像素时调用 addAndRemoveRow() 似乎有点矫枉过正。有没有办法减少调用它的频率?

(或者,是否有更优化的方法来执行此操作?我尝试使用 UICollectionView,但它运行起来并不流畅。)

mockup

最佳答案

我很好奇为什么 UICollectionView 没有帮助。我已经在屏幕上同时显示了具有 100 个单元格的 collectionView,即使在 5 个单元格上它也运行得非常流畅。

如果您仍然有 CollectionView 的实现,我会检查一些事情以查看它是否可以帮助您的性能:

1:确保您正在重用单元格,并且您的数据源不会动态更改,除非它也需要。另外,请确保如果您要向单元格添加更多 subview ,则应在 awakeFromNib 中完成,而不是在配置它时完成,并在可能的情况下重用您的更改。

2:如果启动时出现延迟,请使用估计大小,假设您使用 iOS8+ 和流布局 @property (nonatomic) CGSizeestimatedItemSize NS_AVAILABLE_IOS(8_0);

3:如果您没有使用流布局,请确保您只为 返回正确数量的布局属性 - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect; 您应该只返回矩形中任何内容的属性。

4:尝试不要在边界更改时使布局无效,看看它是否有助于性能。

如果您正在使用 View 做更多动态的事情,那么这是一本很好的读物:http://www.raizlabs.com/2013/10/animating-items-uicollectionview-2/

关于ios - 有没有更有效的方法来检测 UIScrollView 偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29921353/

相关文章:

objective-c - 从 UIScrollView 中删除所有 subview ?

ios - Apple Watch、WatchKit 和 NSUserDefaults

objective-c - 使用类将 NSString 传递到另一个 ViewController

swift - 如何让 Firebase Auth 显示错误?

ios - ScrollView 和堆栈 View

objective-c - 使 UIScrollView 的 subview 固定,而其他 subview 可滚动

ios - 室内导航如何使用 iBeacon 在 iOS 中工作?

ios - 触摸 "buy"后应用内购买失败

ios - Swift 无法将类型的值转换为 Realm 中的预期参数

ios - 如何在 INSendPaymentIntent 中选择电话号码