我有一个UIScrollView,在滚动过程中会出现很多对象(UIImageView)。但是,当用户滚动时,我想向所有这些对象发送消息,以告诉他们不会做任何愚蠢的事情。当UIScrollView减速时,某些动画会在可见对象上发生。当用户快速移动时(pagingEnabled = YES),越来越多的对象仍在动画,这将导致可怕的滚动性能。
我想告诉他们所有人一旦用户滚动就立即停止并不做任何事。那么,我该怎么办? for循环在滚动时对性能不利。它会在一小段时间内晃动,但这足以让用户非常生气。
答案 0 :(得分:4)
将它们全部放在数组中,然后使用[NSArray makeObjectsPerformSelector:]。这是最简洁的方法,但我不确定它比使用for循环更有效...
我不确定你是如何动画你的视图,但是你可能想要使用UIScrollView的委托函数来维护可见项的子数组并将动画限制为那些。例如,每当可见矩形发生变化时,您都可以查看现有的可见视图列表,并查看是否有完全偏离屏幕的情况。你可以停止动画那些。然后,您可以查找屏幕上但不在列表中的视图,并开始对它们进行动画处理。我以前做过这样的事情,它有助于大幅改善性能!
然后,如果你想要冻结所有正在运行的动画,你就会得到一组动画动画并且它相对较短。
希望有所帮助!
答案 1 :(得分:2)
还要记住,计算机只能以线性方式做事。所以无论你做什么,你都必须使用某种循环控制结构。
也许会启动包含循环的线程。并且循环将调用
perfomrselectoronmainthread:
每个对象的选择器。 (记住UI内容必须在主线程上执行。)
我认为你正在使用
+ (void)setAnimationsEnabled:(BOOL)enabled
停止动画。
如果这仍然不够快,你将不得不看核心动画,这些将具有额外的效率,可以实现这一点。
答案 2 :(得分:2)
我会使用通知。这样做的好处是,您可以通知所有对象,并传递所需的所有信息。它也是一种简单但功能强大的机制,允许异步通信。
请参阅通知编程主题简介:
答案 3 :(得分:1)
尝试在不同的线程上执行每条消息。当然所有UI更新都必须在主线程上,但如果你可以在后台线程中做一些工作,也许它会减少一些延迟。 (我不能说这对30多个物体来说是多么可行)