分享

iPhone等待画面的实现旋转的齿轮

 xrzs 2009-09-05

iPhone等待画面的实现 旋转的齿轮 收藏
为了改善程序的用户友好性,当你的iPhone程序需要执行稍稍花点时间的处理的时候,我想显示一个标准的iPhone等待画面是最合适的。那这里咱们使用iPhone SDK中提供标准的控件UIActivityIndicatorView,来简单的实现Mac中经典的旋转轮等待画面。

效果图如下:

 

首先介绍一下UIActivityIndicatorView,UIActivityIndicatorView其实是一个View,所以你可以作为一个子View加入到当前画面的里面。但是当你的程序画面比较多的时候需要每个View去添加UIActivityIndicatorView就比较麻烦了不是。

所以懒人有懒方法,我个人给大家推荐一个简单的懒方法,就是把View添加到程序的唯一的Window中,然后在各个画面需要显示等待窗口的时候,统一调用AppDelegate中自定义的方法就可以了。

view plaincopy to clipboardprint?
// 首先在程序开始的时候在加入window中加入UIActivityIndicatorView   
- (void)applicationDidFinishLaunching:(UIApplication *)application {  
    RootViewController *viewController = [[RootViewController alloc]  
                                            initWithNibName:@"RootViewController" 
                                            bundle:nil];  
    self.rootViewController = viewController;  
    [viewController release];  
    [_window addSubview:_rootViewController.view];  
    // 初始化activityView,计算出当前窗口的中间位置  
    UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc]  
        initWithFrame:CGRectMake(_window.bounds.size.width / 2 - 16.0f,  
                                 _window.bounds.size.height / 2 - 16.0f,  
                                 32.0f,  
                                 32.0f)];  
    activityView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;  
    activityView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin  
                                        | UIViewAutoresizingFlexibleRightMargin  
                                        | UIViewAutoresizingFlexibleTopMargin  
                                        | UIViewAutoresizingFlexibleBottomMargin;  
    activityView.hidesWhenStopped = YES;  
    // INDICATOR_VIEW是我自己定义的一个整数,例:#define INDICATOR_VIEW 10000  
    activityView.tag = INDICATOR_VIEW;  
    // 添加到window  
    [_window addSubview:activityView];  
    [activityView release];  
    [_window makeKeyAndVisible];  
}  
// 首先在程序开始的时候在加入window中加入UIActivityIndicatorView
- (void)applicationDidFinishLaunching:(UIApplication *)application {
    RootViewController *viewController = [[RootViewController alloc]
                                            initWithNibName:@"RootViewController"
                                            bundle:nil];
    self.rootViewController = viewController;
    [viewController release];
    [_window addSubview:_rootViewController.view];
    // 初始化activityView,计算出当前窗口的中间位置
    UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc]
        initWithFrame:CGRectMake(_window.bounds.size.width / 2 - 16.0f,
                                 _window.bounds.size.height / 2 - 16.0f,
                                 32.0f,
                                 32.0f)];
    activityView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
    activityView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin
                                        | UIViewAutoresizingFlexibleRightMargin
                                        | UIViewAutoresizingFlexibleTopMargin
                                        | UIViewAutoresizingFlexibleBottomMargin;
    activityView.hidesWhenStopped = YES;
    // INDICATOR_VIEW是我自己定义的一个整数,例:#define INDICATOR_VIEW 10000
    activityView.tag = INDICATOR_VIEW;
    // 添加到window
    [_window addSubview:activityView];
    [activityView release];
    [_window makeKeyAndVisible];

然后再修改AppDelegate类中加入自定义的方法,用来显示和隐藏等待旋转轮。

view plaincopy to clipboardprint?
- (void)showActivityView {  
    [(UIActivityIndicatorView *)[_window viewWithTag:INDICATOR_VIEW] startAnimating];  
}  
- (void)hideActivityView {  
    // stop之后自动隐藏  
    [(UIActivityIndicatorView *)[_window viewWithTag:INDICATOR_VIEW] stopAnimating];  
}  
- (void)showActivityView {
    [(UIActivityIndicatorView *)[_window viewWithTag:INDICATOR_VIEW] startAnimating];
}
- (void)hideActivityView {
    // stop之后自动隐藏
    [(UIActivityIndicatorView *)[_window viewWithTag:INDICATOR_VIEW] stopAnimating];

接下来就是在各个画面中的调用了,大致如下

view plaincopy to clipboardprint?
XXXAppDelegate *appDelegate = (XXXAppDelegate *)[[UIApplication sharedApplication] delegate];  
[appDelegate showActivityView];  
XXXAppDelegate *appDelegate = (XXXAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate showActivityView]; 

另外再送一个小礼品,当你在调用显示等待画面代码的后面,有一断比较重的代码的时候,程序运行起来,并没有向你想的那样,马上显示等待画面,而是等那断比较重的代码也运行完之后,等待画面再被显示,显然这不是你想要的结果。虽然有几种方法可以避免,比如你可以通过在viewWillAppear方法中分开等待画面的显示,来避免但效果并不理想,会让你的程序感觉上很慢。另外你也可以启动一个Thread来运行也可以,不过好像更慢。有了下面这两个viewController中自带的方法就很方便了,看名字就知道是什么功能了吧。

view plaincopy to clipboardprint?
[self performSelectorInBackground:@selector(yourMethodName) withObject:nil];  
[self performSelectorOnMainThread:@selector(yourMethodName) withObject:nil waitUntilDone:NO];


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/LuWei103/archive/2009/07/31/4397225.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多