本文转载至 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 ,具体原因还没找到让我信服的 ,希望知道的大牛可以回复下。。。。。。。