众所周知,当伟大的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;
        //这里写错了,感谢 阿秉 提出问题,当为倒置方向时才应该旋转
//case UIInterfaceOrientationPortrait:
       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(, , , ); [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 ,具体原因还没找到让我信服的 ,希望知道的大牛可以回复下。。。。。。。

自定义的UIAlertView不能在iOS7上正常显示的更多相关文章

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

    本文转载至 http://blog.csdn.net/hanbing861210/article/details/13614405 众所周知,当伟大的iOS7系统发布后,表扬的一堆.谩骂的也一片,而对 ...

  2. 自定义plain 样式的 tableview,模拟器上不显示分割线,真机上却显示分割线.

    一, 经历 1> 自定义plain 样式的 tableview,模拟器上不显示分割线,真机上却显示cell 下面的分割线. 2> 尝试使用表格的separatorStyle属性,尝试失败. ...

  3. iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案

    今天遇到了在iOS7上使用leftBarButtonItem却无法响应滑动返回事件的问题,一番谷歌,最后终于解决了,在这里把解决方案分享给大家. 在iOS7之前的系统,如果要自定义返回按钮,直接设置b ...

  4. iOS7上的地图定位接口BUG

    遇到个BUG,卡了好久,就是在iOS9上定位接口是正常的,但是在iOS7上就一直拿不到回调,但是看系统日志其实已经定位到了.总是在报一句not response,也没有具体函数名 昨天灵机一动,从de ...

  5. ios7 上 UIActivity 用的image

    在ios8 上UIActivityCategoryShare类型的UIActivity的图标支持彩色图片了,但是在ios7上不行,ios8上的 UIActivityCategoryAction类型也不 ...

  6. iOS7上TableViewCell的button和UIImageView个别未显示的bug

    要做这个cell,用xib将cell做成之后,在iPhone6.6Plus.5s上运行良好,但是在iOS7的5s和iPad上,黄色的小星星和下载按钮均没有显示. 甚为惊奇. 在网上百度之,发现了解决办 ...

  7. phpcms v9自定义表单提交后返回上一页实现方法

    PHPcms v9中提交自定义表单后默认都是回到首页的,是不是感觉很不爽! 接下来,就说下phpcms v9自定义表单提交后返回上一页实现方法. 1.找到这个文件 phpcms\modules\for ...

  8. IOS7上呈现IOS6的水滴刷新效果

    IOS7上呈现IOS6的水滴刷新效果    到了IOS7 发现自带的刷新 不再是 IOS6自带的水滴效果了 你是否怀念那IOS6的效果呢? 哈哈,于是收集各方资料,整理编写一个属于自己的水滴刷新效果 ...

  9. ios7上隐藏status bar

    在iOS7上 对于设置status bar 又有了点点的改变 1.对于 UIViewController 加入了动态改变 status bar style的方法 - (UIStatusBarStyle ...

随机推荐

  1. 了解你的家公家IP

          我们总是在不在家的时候,须要訪问我们的电脑或设备,因为大多数人拥有来自ISP的动态IP,我们能够做一个小型设备来给我们的Android手机发送一个简单的通知,这样我们就能够总有IP用了,有 ...

  2. 内存排查 valgrind

    内存问题排查工具 --- valgrind 1. 概述 2. Valgrind 3. 内存泄漏监测 3.1. 示例代码 3.2. 编译它 3.3. 用Valgrind监测进程的内存泄漏 4. 悬挂指针 ...

  3. HDU 1385 Minimum Transport Cost 最短路径题解

    本题就是使用Floyd算法求全部路径的最短路径,并且须要保存路径,并且更进一步须要依照字典顺序输出结果. 还是有一定难度的. Floyd有一种非常巧妙的记录数据的方法,大多都是使用这种方法记录数据的. ...

  4. 设置CentOS开机连接网络 Centos 开机启动网卡的设置方法

    我们开机网卡不能启动所以只能使用 ifup eth0 (eth0指的网卡) 来启动了,但是每一次都这样感觉不方便希望开机自动启动网卡 后来百度搜索了一下发现可以通过修改网卡( ifcfg-eth0)参 ...

  5. jq入门--选择器

    选择器是JQuery一大特色,所有的DOM操作.事件操作.Ajax操作都离不开选择器.熟练掌握JQuery的选择器,可以节省很多代码,很大程序上简化我们的脚本编程工作. JQuery的选择器很类似于样 ...

  6. NGUI ScrollView动态加入和删除对象。

    动态加入,基本思想是: 1.先把要加入的元素在编辑器中编辑好,制作成一个prefab. 2.在代码中,动态的生成一个新的对象增加到Grid对象的子对象中.这里利用到了Resources对象,这个对象的 ...

  7. 通过Web Api 和 Angular.js 构建单页面的web 程序

    通过Web Api 和 Angular.js 构建单页面的web 程序 在传统的web 应用程序中,浏览器端通过向服务器端发送请求,然后服务器端根据这个请求发送HTML到浏览器,这个响应将会影响整个的 ...

  8. HTML5它contenteditable属性

    HTML5它contenteditable属性 1.功能说明 (1)功能:同意用户编辑元素中的内容 (2)说明:是一个布尔值.false是不能编辑,true为可编辑 2.分析实例 (1)content ...

  9. MonkeyDevcie API 实践全记录

    1.    背景 使用SDK自带的NotePad应用作为实践目标应用,目的是对MonkeyDevice拥有的成员方法做一个初步的了解. 以下是官方列出的方法的Overview. Return Type ...

  10. [翻译]MEAN.IO与MEAN.JS的前世今生

    写在前面: 因为项目要求要学习mean,所以要从搭建环境开始,网上的教程不怎么多,但是感觉方法倒是不少,也没多想,就开始安装,运行起来发现怎么和安装教程中的目录结构不同? 想了好久,也翻看目录半天,总 ...