gpt4 book ai didi

ios - 为什么应用程序暂停时事件指示器仍在旋转?

转载 作者:可可西里 更新时间:2023-11-01 03:17:45 24 4
gpt4 key购买 nike

我创建了一个只有一个按钮和一个事件指示器的简单应用程序。当我按下按钮时,事件指示器开始动画。在 Xcode 4.6 iPhone 6.1 模拟器中,我看到事件指示器在旋转。当我暂停应用程序时,我有时会进入 libsystem_kernel.dylib`mach_msg_trap。这似乎在线程 1 的 com.apple.main-thread 上。以这种方式暂停应用程序不应该阻塞主线程,从而停止事件指示器旋转吗?它似乎没有。

更新:这篇文章 ( http://www.dragthing.com/blog/2009/07/how-to-make-your-iphone-app-launch-faster/ ) 说“正如我所发现的,UIActivityIndi​​catorView 动画是由系统在一个线程上运行的——这意味着,即使我的应用程序在启动时被阻塞在它的初始化代码中,微调器仍将旋转。” UIActivityIndi​​catorView 是否有可能在主线程之外进行动画处理?

最佳答案

UIActivityIndi​​cator 使用 UIImageView subview 绘制其图像,并通过将 CAKeyframeAnimation 附加到 ImageView 的层来为图像设置动画。您可以通过打印 View 层次结构来查看排列:

(lldb) po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
<UIWindow: 0x7fd778808c00; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x6000013b9ef0>; layer = <UIWindowLayer: 0x600001dcd400>>
| <UIView: 0x7fd778d036f0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x600001dc5bc0>>
| | <UIActivityIndicatorView: 0x7fd778d00280; frame = (177 323; 0 0); opaque = NO; autoresize = RM+BM; tintColor = UIExtendedGrayColorSpace 0 0.45; layer = <CALayer: 0x600001dc5a80>>
| | | <UIImageView: 0x7fd778d06680; frame = (-10 -10; 20 20); opaque = NO;
userInteractionEnabled = NO; animations = {
contents=<CAKeyframeAnimation: 0x600001dc5f40>;
contentsMultiplyColor=<CAKeyframeAnimation: 0x600001dc5fa0>;
}; layer = <CALayer: 0x600001dc5ae0>>

您的应用不会运行这些动画。您的应用程序将这些动画发送到窗口服务器,窗口服务器运行它们。这就是为什么当您的应用程序暂停时它们会继续运行。您应用中的所有线程都已暂停,但窗口服务器并未暂停。

您可以通过停止模拟器的窗口服务器来证明这一点。它称为 backboardd。从命令行运行此命令:

killall -STOP backboardd

您会看到事件指示器停止旋转。然后运行此命令恢复:

killall -CONT backboardd

关于ios - 为什么应用程序暂停时事件指示器仍在旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16369956/

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