自定义的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;
//这里写错了,感谢 阿秉 提出问题,当为倒置方向时才应该旋转- //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上正常显示的更多相关文章
- IOS 7 自定义的UIAlertView不能在iOS7上正常显示
本文转载至 http://blog.csdn.net/hanbing861210/article/details/13614405 众所周知,当伟大的iOS7系统发布后,表扬的一堆.谩骂的也一片,而对 ...
- 自定义plain 样式的 tableview,模拟器上不显示分割线,真机上却显示分割线.
一, 经历 1> 自定义plain 样式的 tableview,模拟器上不显示分割线,真机上却显示cell 下面的分割线. 2> 尝试使用表格的separatorStyle属性,尝试失败. ...
- iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
今天遇到了在iOS7上使用leftBarButtonItem却无法响应滑动返回事件的问题,一番谷歌,最后终于解决了,在这里把解决方案分享给大家. 在iOS7之前的系统,如果要自定义返回按钮,直接设置b ...
- iOS7上的地图定位接口BUG
遇到个BUG,卡了好久,就是在iOS9上定位接口是正常的,但是在iOS7上就一直拿不到回调,但是看系统日志其实已经定位到了.总是在报一句not response,也没有具体函数名 昨天灵机一动,从de ...
- ios7 上 UIActivity 用的image
在ios8 上UIActivityCategoryShare类型的UIActivity的图标支持彩色图片了,但是在ios7上不行,ios8上的 UIActivityCategoryAction类型也不 ...
- iOS7上TableViewCell的button和UIImageView个别未显示的bug
要做这个cell,用xib将cell做成之后,在iPhone6.6Plus.5s上运行良好,但是在iOS7的5s和iPad上,黄色的小星星和下载按钮均没有显示. 甚为惊奇. 在网上百度之,发现了解决办 ...
- phpcms v9自定义表单提交后返回上一页实现方法
PHPcms v9中提交自定义表单后默认都是回到首页的,是不是感觉很不爽! 接下来,就说下phpcms v9自定义表单提交后返回上一页实现方法. 1.找到这个文件 phpcms\modules\for ...
- IOS7上呈现IOS6的水滴刷新效果
IOS7上呈现IOS6的水滴刷新效果 到了IOS7 发现自带的刷新 不再是 IOS6自带的水滴效果了 你是否怀念那IOS6的效果呢? 哈哈,于是收集各方资料,整理编写一个属于自己的水滴刷新效果 ...
- ios7上隐藏status bar
在iOS7上 对于设置status bar 又有了点点的改变 1.对于 UIViewController 加入了动态改变 status bar style的方法 - (UIStatusBarStyle ...
随机推荐
- HTML在Select具体的使用说明
<html> <head> <SCRIPT LANGUAGE="JavaScript"> <!-- //oSelect 列表的底部加入了一 ...
- 关于”机器学习方法“,"深度学习方法"系列
"机器学习/深度学习方法"系列,我本着开放与共享(open and share)的精神撰写,目的是让很多其它的人了解机器学习的概念,理解其原理,学会应用.如今网上各种技术类文章非常 ...
- winhec
#winhec# 开发人员刷屏看点 (视频) 今天大家已经被winhec刷屏了,本来不想写这篇了,但看了所有的文章,大家关注的都是windows 10的那些新功能,小米win10刷机,联想千元手机,小 ...
- c# 文件同步服务器,iis 集群 ,代码同步(二)
打算自己做一个 集群 代码同步软件. 基于Socket 和 FileSystemWatcher .
- Fckeditor用法
试Fckeditor版本号:2.6.3 眼下Fckeditor仅仅能用于基于ie内核的浏览器,假设要使用于chrome等浏览器,请使用ckeditor. 详细用法: 1.将解压后的fckeditor整 ...
- fast-json.jar的用法
fast-json.jar 解析json数据:一种json数据解析方式是这种,点击这里下载jsonfast.jar+fastjsonAPI文档 [ { "id": 6378, &q ...
- webkit的几个属性
-webkit-text-size-adjust 1.当样式表里font-size<12px时,中文版chrome浏览器里字体显示仍为12px,这时可以用 html{-webkit-text-s ...
- c语言mysql api
原文:c语言mysql api 1.mysql_affected_rows() //返回上次UPDATE.DELETE或INSERT查询更改/删除/插入的行数. 2.mysql_ ...
- mvc拦截器
在ASP.NET MVC中,有三种拦截器:Action拦截器.Result拦截器和Exception拦截器.这里说的是第一种和第三种.其实所谓的ASP.NET MVC拦截器,也没什么神秘的,就是一个普 ...
- 你不明白 String 类别
序 前几篇文章一直在研究 WEB 安全的问题,并且近期工作中也一直在解决这些安全漏洞.当然,兴许的博客中还会就这些暴露出来的问题谈谈我的解决方式,仅仅只是,在这篇博客中,我想谈点别的问题.并且对于我们 ...