IOS 7 自定义的UIAlertView不能在iOS7上正常显示

众所周知,当伟大的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 ,具体原因还没找到让我信服的 ,希望知道的大牛可以回复下。。。。。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值