- (void)scrollViewDidScroll:(UIScrollView *)scrollView 在 iOS 8 中太慢了

Posted

技术标签:

【中文标题】- (void)scrollViewDidScroll:(UIScrollView *)scrollView 在 iOS 8 中太慢了【英文标题】:- (void)scrollViewDidScroll:(UIScrollView *)scrollView too slow in iOS 8 【发布时间】:2015-08-13 06:28:20 【问题描述】:

我有一个问题,即在第二个 scrollview 上从 scrollviewdidscroll 内向上/向下滚动和设置 contentoffset 会导致轻微的抖动行为......或者更准确地说是低帧速率。

我目前依靠scrollViewDidScroll来管理我UIScrollView中的视差等效果,这些效果是通过监听scrollViewDidScroll来应用的,但是这个方法每次调用的周转时间是(出于某种原因) ,太慢并导致足够的延迟,使其在滚动时看起来有点糟糕。

有趣的是,ios 9 运行良好。

我尝试了其他方法,例如关闭图像或使用AsyncDisplayKit,但两者都对触发scrollViewDidScroll 的次数没有影响。

在我看来,我可能需要重新设计创建视差效果的方式,但我很犹豫,以防万一有快速修复。

【问题讨论】:

【参考方案1】:

首先——使用Xcode Instruments调试工具“Time Profiler”(Xcode菜单Product->Profile,然后从instruments中选择Time Profiler)。

不要忘记检查“反转调用树”和“隐藏系统库”复选标记,并检测代码中的问题位置。

之后你可以找到一些解决方案。

至少您可以在为第二个滚动视图设置contentOffset 属性之前尝试添加额外的检查:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
    CGFloat contentOffsetForSecondScrollView = 123.0; // Calculate second scroll view content offset
    // Add additional check, if content offset doesn't change
    if (self.secondScrollView.contentOffset.y != contentOffsetForSecondScrollView) 
        self.secondScrollView.contentOffset = CGPointMake(0, contentOffsetForSecondScrollView);
    

【讨论】:

谢谢,分析建议让我找到了一行代码,与 UIView 的圆角有关...奇怪的是它在 iOS9.0 中完美运行我刚刚创建了一个图像视图而是圆角。【参考方案2】:

将所有效果放在下面的方法中。

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

【讨论】:

这只是表示 UI 在用户松开手指之前不会更新,也意味着动画不起作用。【参考方案3】:

请把委托方法放在下面来改进和检测滚动

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

   //Your code here

【讨论】:

这只是表示 UI 在用户松开手指之前不会更新,也意味着动画不起作用。

以上是关于- (void)scrollViewDidScroll:(UIScrollView *)scrollView 在 iOS 8 中太慢了的主要内容,如果未能解决你的问题,请参考以下文章

从 'void* (*)(int*)' 到 'void* (*)(void*)' 的无效转换

错误:从‘void*’到‘void* (*)(void*)’的无效转换 - pthreads

void类型及void指针

Void & void Void用在泛型

void类型和void* 的用法

void*和void类型