- (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*)' 的无效转换