gpt4 book ai didi

iphone - 在 iOS 上运行无限循环的动画

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:21 28 4
gpt4 key购买 nike

我有一个简单的 UIView,它使用 drawRect: 自行绘制。为了使 View 具有动画效果,drawRect 方法需要每隔 0.05 秒调用一次,因此我使用了一个重复计时器:

timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self 
selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES];

我不太了解运行循环、线程和所有系统的东西,所以我想知道这是否是运行动画的正确方法?这个计时器无休止地重复自己。这是我应该担心的事情吗?这会阻塞主线程吗?我可以做些什么来最大程度地减少对性能的总体影响?

最佳答案

这个方法还不错,但还有其他方法可以做到。

定时器的目标方法必须将定时器作为参数,所以不要直接为 setNeedsDisplay 设置它,你应该设置一个这样的方法:

- (void)animationTimerDidFire:(NSTimer *)timer
{
[myView setNeedsDisplay];
}

如果您的 View 始终可见,那么您只需设置并忘记计时器即可。另一方面,如果它可能因为您切换到不同的 View 而消失,您将需要根据需要使计时器失效并重新创建。

您的应用程序的主线程使用运行循环并调用各种方法来响应事件,例如用户点击、系统通知(例如,内存警告)和 I/O 到达。如果运行循环调用的任何东西需要很长时间才能返回,它会阻塞队列中的所有东西。当你设置一个计时器时,它会被添加到一个列表中,并且运行循环每次都会检查它;如果其中一个计时器准备就绪,它会调用您的方法。

最终结果是计时器不准确:它们可能不会像您喜欢的那样频繁触发,可能会延迟调用等。同样,如果您的应用非常简单,则主运行循环不会很忙并且所以计时器可能就足够了。只需确保您的动画基于调用之间实际耗时,而不是假设每次调用恰好相隔 0.05 秒。

备选方案

如果您的动画只涉及翻阅一些静态图像,UIImageView 对此有一些支持。

如果创建每一帧动画都需要花费大量时间(并且您不想阻塞主线程),您可以使用后台队列绘制到图像中(参见 CGBitmapContextCreateCGBitmapContextCreateImage),然后在新图像准备好显示时向主线程发出信号。任何接触 View 的事情都必须在主线程上发生,但您可以在后台进行绘图。

您可能还想阅读 QuartzCore 框架中的 CALayer。这是 UIView 对象实际操作以在屏幕上绘制的内容。您可能会发现,您可以通过操纵一些 CALayer 对象并让 Core Animation 完成繁重的工作来获得您想要的效果,而不是绘图(例如,您将颜色从红色更改为蓝色,Core Animation 负责从一淡化到另一个)。

关于iphone - 在 iOS 上运行无限循环的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11197248/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com