自定义的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 ...
随机推荐
- HDU 4107 线段树
给出N个节点,M次操作,和p 每次操作 对l-r区间的每一个节点+c,若节点值>=p,则加2*c: 结点存当前区间伤害最小值,最大值,以及lazy操作.更新到假设最小值大于等于P,或者最大值小于 ...
- linux_ubuntu12.04 卸载和安装mysql、远程访问、not allowed
一: 安装mysql 卸载mysql 第一步 sudo apt-get autoremove --purge mysql-server-5.0 sudo apt-get remove mysql-se ...
- Swift中文教程(二)--简单值
原文:Swift中文教程(二)--简单值 Swift使用let关键字声明常量,var关键字声明变量.常量无需在编译时指定,但至少要被赋值一次.也就是说,赋值一次多次使用: var myVariable ...
- 【高德地图API】从零开始学高德JS API(四)搜索服务——POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索
原文:[高德地图API]从零开始学高德JS API(四)搜索服务——POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索 摘要:地图服务,大家能想到哪些?POI搜素,输入提示,地址解析,公 ...
- 让Sqlite脱离VC++ Runtime独立执行
前段时间在开发OrayTalk(傲瑞通企业即时通信系统)的聊天记录模块时用到了Sqlite,这是我第一次接触和使用Sqlite,整体感觉还是很不错的.这里把我使用Sqlite的经验跟大家分享一下. 一 ...
- MapReduce 编程模型
一.简单介绍 1.MapReduce 应用广泛的原因之中的一个在于它的易用性.它提供了一个因高度抽象化而变得异常简单的编程模型. 2.从MapReduce 自身的命名特点能够看出,MapReduce ...
- centos7看电影
sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm sudo rpm ...
- BestCoder Round #11 (Div. 2) 题解
HDOJ5054 Alice and Bob Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- js页码生成库,一个适合前后端分离的页码生成器
原文:js页码生成库,一个适合前后端分离的页码生成器 前言 上星期写的任务里面有需要进行分页的处理,git搜索了一番,没有觉得合适的,于是自己临时写了个分页的算法. 然后等闲下来的时候,决定把分页进行 ...
- Oracle 11g for Windows 简体中文版的安装过程
原文:Oracle 11g for Windows 简体中文版的安装过程 我的配置 操作系统:Windows Server 2003 sp2 内存:1024M以上 1.下载Oracle 11g 地址 ...