本文转载至 http://blog.csdn.net/hanbing861210/article/details/13614405
众所周知,当伟大的iOS7系统发布后,表扬的一堆、谩骂的也一片,而对于我们程序员来说最关心的莫过于低版本系统上的程序在搞版本系统上的兼容性问题了。
在iOS6.1几之前,当我们想要做一些提醒用户或临时获取一些数据时,通常会弹出一个模态试图,给予用户提醒,而最常见的做法莫过于直接用UIAlertView添加控件或继承UIAlertView,然后添加自己想要的控件,如:在执行网络连接 下载等耗时任务时我们会弹出一个view 然后显示一个指示器,具体做法:
- ( IBAction )showTraditionAlert:( id )sender { UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@ "正在下载....." message: nil delegate: self cancelButtonTitle:@ "Cancel" otherButtonTitles:@ "Ok" , nil ]; alertView.delegate = self ; [alertView show]; } #pragma mark -- UIAlertViewDelegate //实现代理增加网络指示器 - ( void )willPresentAlertView:(UIAlertView *)alertView;{ indicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; indicator.frame = CGRectMake(110, 20, 50, 50); [alertView addSubview:indicator]; [indicator startAnimating]; [indicator release]; } - ( void )alertView:(UIAlertView *)alertView clickedButtonAtIndex:( NSInteger )buttonIndex{ [indicator stopAnimating]; } |
但上面的做法到了iOS7上就没有用了 ,你自己所添加的控件根本显示不出来,也就是说在iOS7上不允许我们更改系统的UIAlertView了(至少目前是这样2013/07/18 beta3版本),我想大家肯定也遇到了这样的问题,那现在改怎么半呢? 可以采用UIWindow的方式实现具体做法网上很多,我比较懒 随便写了点
// // CustomizedAlertAnimation.h // AlertAnimationDemo // // Created by PSH_Chen_Tao on 7/18/13. // Copyright (c) 2013 wolfman. All rights reserved. // //这个类主要时用来对指定的view进行动画,,动画类似UIAlertView的出现和消失 #import <Foundation/Foundation.h> @protocol CustomizedAlertAnimationDelegate; @interface CustomizedAlertAnimation : NSObject @property (strong, nonatomic )UIView *view; @property (assign, nonatomic ) id <CustomizedAlertAnimationDelegate> delegate; -( id )customizedAlertAnimationWithUIview:(UIView *)v; -( void )showAlertAnimation; -( void )dismissAlertAnimation; @end @protocol CustomizedAlertAnimationDelegate -( void )showCustomizedAlertAnimationIsOverWithUIView:(UIView *)v; -( void )dismissCustomizedAlertAnimationIsOverWithUIView:(UIView *)v; @end |
// // CustomizedAlertAnimation.m // AlertAnimationDemo // // Created by PSH_Chen_Tao on 7/18/13. // Copyright (c) 2013 wolfman. All rights reserved. // #import "CustomizedAlertAnimation.h" static CGFloat kTransitionDuration = 0.3; @implementation CustomizedAlertAnimation @synthesize view; @synthesize delegate; -( void )dealloc{ if (delegate) { delegate = nil ; } [view release]; view = nil ; [ super dealloc]; } -( id )customizedAlertAnimationWithUIview:(UIView *)v{ if ( self =[ super init]) { view = v; } return self ; } //get the transform of view based on the orientation of device. -(CGAffineTransform)transformForOrientation{ CGAffineTransform transform ; UIInterfaceOrientation orientation = [[UIApplication sharedApplication ]statusBarOrientation]; switch (orientation) { case UIInterfaceOrientationLandscapeLeft: transform = CGAffineTransformMakeRotation(M_PI*1.5); break ; case UIInterfaceOrientationLandscapeRight: transform = CGAffineTransformMakeRotation(M_PI/2); break ;<br> //这里写错了,感谢 <a id="a_comment_author_2783455" href="http://home.cnblogs.com/u/570796/" target="_blank">阿秉</a> 提出问题,当为倒置方向时才应该旋转 //case UIInterfaceOrientationPortrait:<br> case UIInterfaceOrientationPortraitUpsideDown: |
transform = CGAffineTransformMakeRotation(-M_PI); break ; default : transform = CGAffineTransformIdentity; break ; } return transform; } // begin the animation -( void )showAlertAnimation{ view.transform = CGAffineTransformScale([ self transformForOrientation], 0.001, 0.001); [UIView beginAnimations: nil context: nil ]; [UIView setAnimationDuration:kTransitionDuration/1.5]; [UIView setAnimationDelegate: self ]; [UIView setAnimationDidStopSelector: @selector (firstBouncesDidStop)]; view.transform = CGAffineTransformScale([ self transformForOrientation], 1.1, 1.1); [UIView commitAnimations]; } -( void )dismissAlertAnimation{ [UIView beginAnimations: nil context: nil ]; [UIView setAnimationDuration:kTransitionDuration/2]; [UIView setAnimationDelegate: self ]; view.alpha = 0; [UIView setAnimationDidStopSelector: @selector (dismissAlertAnimationDidStoped)]; [UIView commitAnimations]; } #pragma mark -- UIViewAnimation delegate -( void )firstBouncesDidStop{ [UIView beginAnimations: nil context: nil ]; [UIView setAnimationDuration:kTransitionDuration/2]; [UIView setAnimationDelegate: self ]; [UIView setAnimationDidStopSelector: @selector (secondBouncesDidStop)]; view.transform = CGAffineTransformScale([ self transformForOrientation], 0.9, 0.9); [UIView commitAnimations]; } -( void )secondBouncesDidStop{ [UIView beginAnimations: nil context: nil ]; [UIView setAnimationDelegate: self ]; [UIView setAnimationDuration:kTransitionDuration/2]; view.transform = [ self transformForOrientation]; [UIView commitAnimations]; //You can do somethings at the end of animation [ self .delegate showCustomizedAlertAnimationIsOverWithUIView:view]; } -( void )dismissAlertAnimationDidStoped{ [ self .delegate dismissCustomizedAlertAnimationIsOverWithUIView:view]; } @end |
// // ; // AlertDemo // // Created by PSH_Chen_Tao on 7/19/13. // Copyright (c) 2013 wolfman. All rights reserved. // //自定义的 alert view 类 #import <Foundation/Foundation.h> #import "CustomizedAlertAnimation.h" @protocol CustomeAlertViewDelegate ; @interface CustomeAlertView : UIWindow <CustomizedAlertAnimationDelegate> @property (strong, nonatomic )UIView *myView; @property (strong, nonatomic )UIActivityIndicatorView *activityIndicator; @property (strong, nonatomic )CustomizedAlertAnimation *animation; @property (assign, nonatomic ) id <CustomeAlertViewDelegate> delegate; -( void )show; @end @protocol CustomeAlertViewDelegate -( void )CustomeAlertViewDismiss:(CustomeAlertView *) alertView; @end |
// // CustomeAlertView.m // AlertDemo // // Created by PSH_Chen_Tao on 7/19/13. // Copyright (c) 2013 wolfman. All rights reserved. // #import "CustomeAlertView.h" @implementation CustomeAlertView @synthesize myView; @synthesize activityIndicator; @synthesize animation; @synthesize delegate; -( id )init{ if ( self =[ super init]) { self .frame = [[UIScreen mainScreen] bounds]; self .backgroundColor = [UIColor clearColor]; //UIWindow的层级 总共有三种 self .windowLevel = UIWindowLevelAlert; myView = [[UIView alloc]initWithFrame:CGRectMake(30, 140, 260, 200)]; UIButton *okButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [okButton setBackgroundImage:[UIImage imageNamed:@ "alert-view-ok-button" ] forState:UIControlStateNormal]; [okButton addTarget: self action: @selector (pressoKButton:) forControlEvents:UIControlEventTouchUpInside]; okButton.frame = CGRectMake(90, 130, 80, 40); [myView addSubview:okButton]; // [okButton release]; activityIndicator = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(105, 75, 50, 50)]; activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite; [myView addSubview:activityIndicator]; // [activityIndicator release]; UIImageView *imageView = [[UIImageView alloc]initWithFrame:myView.bounds]; [imageView setImage:[[UIImage imageNamed:@ "alert-view-bg-portrait" ] stretchableImageWithLeftCapWidth:100 topCapHeight:30]]; [myView insertSubview:imageView atIndex:0]; [imageView release]; animation = [[CustomizedAlertAnimation alloc]customizedAlertAnimationWithUIview:myView]; animation.delegate = self ; [ self addSubview:myView]; [myView release]; } return self ; } -( void )show{ [ self makeKeyAndVisible]; [animation showAlertAnimation]; } -( void )dismiss{ [ self resignKeyWindow]; [animation dismissAlertAnimation]; } -( void ) pressoKButton:( id )sender{ [ self dismiss]; } #pragma mark -- CustomizedAlertAnimationDelegate //自定义的alert view出现动画结束后调用 -( void )showCustomizedAlertAnimationIsOverWithUIView:(UIView *)v{ NSLog (@ "showCustomizedAlertAnimationIsOverWithUIView" ); [activityIndicator startAnimating]; } //自定义的alert view消失动画结束后调用 -( void )dismissCustomizedAlertAnimationIsOverWithUIView:(UIView *)v{ NSLog (@ "dismissCustomizedAlertAnimationIsOverWithUIView" ); [activityIndicator stopAnimating]; [ self .delegate CustomeAlertViewDismiss: self ]; } @end |
// // ViewController.h // AlertDemo // // Created by PSH_Chen_Tao on 7/19/13. // Copyright (c) 2013 wolfman. All rights reserved. // #import <UIKit/UIKit.h> #import "CustomeAlertView.h" @interface ViewController : UIViewController <UIAlertViewDelegate,CustomeAlertViewDelegate> - ( IBAction )showTraditionAlert:( id )sender; - ( IBAction )showWindowAlert:( id )sender; @property (strong, nonatomic ) UIActivityIndicatorView *indicator; @property (strong, nonatomic )CustomeAlertView *customeAlertView; @end |
// // ViewController.m // AlertDemo // // Created by PSH_Chen_Tao on 7/19/13. // Copyright (c) 2013 wolfman. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize indicator; @synthesize customeAlertView; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)showTraditionAlert:(id)sender { UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"正在下载....." message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil]; alertView.delegate = self; [alertView show]; } - (IBAction)showWindowAlert:(id)sender { customeAlertView = [[CustomeAlertView alloc]init]; customeAlertView.delegate = self; [customeAlertView show]; } #pragma mark -- UIAlertViewDelegate //实现代理增加网络指示器 - (void)willPresentAlertView:(UIAlertView *)alertView;{ indicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; indicator.frame = CGRectMake(110, 20, 50, 50); [alertView addSubview:indicator]; [indicator startAnimating]; [indicator release]; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ [indicator stopAnimating]; } #pragma mark -- CustomeAlertViewDelegate -(void)CustomeAlertViewDismiss:(CustomeAlertView *) alertView{ [alertView release]; NSLog(@"CustomeAlertViewDismiss"); } @end
对于UIWindow的相关东西可以参考 http://www.cnblogs.com/smileEvday/archive/2012/03/27/2420362.html#2728097
注意设计到UIWindow显示的工程不能用arc ,具体原因还没找到让我信服的 ,希望知道的大牛可以回复下。。。。。。。