Ger*_*ard 8 xcode breakpoints objective-c uiactivityindicatorview ios
我用一个按钮和一个活动指示器创建了一个简单的应用程序.当我按下按钮时,我有活动指示器开始动画.在Xcode 4.6 iPhone 6.1 Simulator中,我看到活动指示器正在旋转.当我暂停应用程序时,我有时会进入libsystem_kernel.dylib`mach_msg_trap.这似乎是在com.apple.main-thread上,它是线程1.不应该以这种方式暂停应用程序阻止主线程,因此阻止活动指示器旋转?它似乎没有.
更新:本文(http://www.dragthing.com/blog/2009/07/how-to-make-your-iphone-app-launch-faster/)说"我发现,UIActivityIndicatorView动画是在系统的一个线程 - 这意味着,即使我的应用程序在启动时在其初始化代码中被阻塞,微调器仍然会旋转.是否有可能将UIActivityIndicatorView设置为主线程的动画?
AUIActivityIndicator使用UIImageView子视图绘制其图像,并通过将 a 附加CAKeyframeAnimation到图像视图的图层来为图像设置动画。您可以通过打印视图层次结构来查看排列:
(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>>
Run Code Online (Sandbox Code Playgroud)
您的应用不会运行这些动画。您的应用程序将这些动画发送到窗口服务器,然后窗口服务器运行它们。这就是为什么当您的应用程序暂停时它们会继续运行的原因。应用程序中的所有线程都已暂停,但窗口服务器并未暂停。
您可以通过停止模拟器的窗口服务器来证明这一点。它被称为backboardd。从命令行运行以下命令:
killall -STOP backboardd
Run Code Online (Sandbox Code Playgroud)
您会看到活动指示器停止旋转。然后运行此命令以恢复:
killall -CONT backboardd
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
952 次 |
| 最近记录: |