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
|