这里主要解析 UIAlertView 的几个关键功能的实现:

  • 随着设备屏幕的旋转而旋转;
  • Alert弹出框,使用UIWindow来实现,就是说,不用依赖于当前显示在最前面的UIView。

实现源码参考: http://git.oschina.net/shede333/BMAlertHud

使用UIWindow

弹出一个Alert框,最好新建一个 UIWIndow

  • 把window.windowLevel = UIWindowLevelAlert,这样就能显示在最前面;
  • 调用[window makeKeyAndVisible],该window就能显示,
  • 调用[window resignKeyWindow],该window就能消失,转而显示之前的window,
  • 尽量不要直接设置[window addSubview:alertView],直接往window上加UIView,屏幕旋转时会有问题;因为,屏幕旋转时,app会依次调用 key-window -> window.rootViewController,所以,在new一个UIWindow是,最好也给window设置一个rootViewController, 然后把你需要显示的AlertView 贴在rootViewController.view上,这样便于后面处理屏幕旋转问题.

屏幕旋转实现

这里直说 iOS6 以及更高系统版本的实现; UIViewController两个系统函数

  • - (BOOL)shouldAutorotate :是否支持旋转,默认返回 YES
  • - (NSUInteger)supportedInterfaceOrientations :支持哪几个方向旋转(共4个方向,使用枚举值UIInterfaceOrientationMask来设定);
    只有上面的shouldAutorotate返回YES,这个函数才会被调用; iPad上的默认值为UIInterfaceOrientationMaskAll
    iPhone的默认值为UIInterfaceOrientationMaskAllButUpsideDown

重写以上两个函数,即可实现屏幕的旋转与否。

屏幕旋转时,控件位置自定义

UIViewController两个系统函数,但在iOS8上被放弃了,主要是实现:屏幕旋转时,子VIew布局位置的更改,这里区分一下:

  • - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    这函数是被放在屏幕旋转动画的 Animation-Block 里,所以,这里对子View做的任何改变,都会动画的实现,屏幕旋转时,要自定义改变子View的位置,就在这里实现。

  • - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    重写这个函数,里面的代码的实现不会动画,建议屏幕旋转时,需要把类似禁止View的触摸事件、停止音乐播放等动作放在此处;


适配问题

这里要区分iOS6、7 和 iOS8 的区别:

屏幕 Screen的Size :  [[UIScreen mainScreen] bounds].size

在iOS6、7 随着屏幕的旋转,Screen的Size,以及相关UIViewController的view的长宽是 不变的,即高 总是大于 宽;
在iOS8上,随着屏幕的旋转,Screen的Size,以及相关UIViewController的view的长宽是 改变的

所以,需要设置AlertView随屏幕的旋转而旋转的话,考虑到适配iOS6、7、8,需要做以下设置:

  • - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 这个函数里实现:屏幕旋转时,设置子View的位置, 注意Screen的Size在ios8上是会改变的。

其实iOS8上对屏幕旋转的支持很好,我们只需要把子view的autoresizingMask设置好,就会达到我们需要的效果;
但是在iOS6、7上,我们队子View的更改,大部分工作都需要在- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 里主动设置子view;

参考

实现源码参考: http://git.oschina.net/shede333/BMAlertHud

iOS系统自带的 UIAlertView 自动旋转的实现

iOS系统自带的 UIAlertView 自动旋转的实现的更多相关文章

  1. iOS系统自带分享功能

    很多APP中都带有社交分享功能,通过用户的分享,让更多地人去了解和使用这个APP,目前社交分享是移动互联网应用程序推广的最重要手段之一,国内较或的分享平台有微信,IOS6后苹果集成的新浪微博,还有IO ...

  2. video 在iphone手机的ios系统和微信端无法自动播放

    描述:video 在iphone手机,微信端无法自动播放,ios系统下不能自动播放视频.而且如果没有autoplay属性,在微信端点击一次,弹不出视频,要一直触着两秒后才可以打开视频.如果点击播放的话 ...

  3. 社交网络编程API之iOS系统自带分享

    社交网络编程API 社交网络编程主要使用iOS提供的Social框架,目前Social框架主要包含两个类: SLComposeViewController 提供撰写社交信息(如微博信息)的视图控制器, ...

  4. 利用UIActivityController调用ios系统自带的分享功能,实现微信发布多图的功能

    通过一番查找以后找到一个类UIActivityController,可以调用系统的social.framework中的分享接口.看下面的图就知道了,这个还是挺常见的 微信发布多图 借鉴了CSDN上的一 ...

  5. H5的audio在ios系统的微信上不能自动播放的问题

    前几天有个需求,要在H5页面中添加背景音乐,本以为很easy,却也踩了一些坑,废话不多说,进入正题: 撸完代码测试的时候才发现在安卓手机上背景音乐可以正常播放,但在iphone里的微信和safari中 ...

  6. iOS系统自带正则表达式简单运用

    //组装一个字符串,把里面的网址解析出来 NSString *urlString = @"sfdshttp://www.baidu.com"; NSError *error; // ...

  7. ios系统web(微信公众号)开发遇到的问题及解决方案

    1.1. 页面滚动不流畅(2017-09-25) 现象: 网页竖向滚动或横向滚动不流畅. 解决方案: 为滚动元素添加css样式: -webkit-overflow-scrolling: touch; ...

  8. IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)

    转自 http://blog.csdn.net/zzfsuiye/article/details/8251060 概述: 在iOS6之前的版本中,通常使用 shouldAutorotateToInte ...

  9. Ios二维码扫描(系统自带的二维码扫描)

    Ios二维码扫描 这里给大家介绍的时如何使用系统自带的二维码扫描方法和一些简单的动画! 操作步骤: 1).首先你需要搭建UI界面如图:下图我用了俩个imageview和一个label 2).你需要在你 ...

随机推荐

  1. HTML+CSS笔记 CSS进阶

    文字排版 字体 我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性. 语法: body{font-family:"宋体";} 这里注意不要设置不常用的字体,因为如果 ...

  2. Oracle SQL篇(四)group by 分组与分组的加强 rollup

        分组操作group by 和分组的强化(rollup) 分组操作和分组函数的使用,对于编写SQL语句的人来说,是最基本的概念. 我们来看下面的例子: 在这里我们使用员工表EMP scott@D ...

  3. ORA-20000: ORU-10027: buffer overflow, limit of 10000 bytes

        要用dbms_output.put_line来输出语句,遇到以下错误: ERROR 位于第 1 行: ORA-20000: ORU-10027: buffer overflow, limit ...

  4. Android系统智能指针的设计思路(轻量级指针、强指针、弱指针)

    本博客为原创,转载请注明出处,谢谢. 参考博文:Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 C++中最容易出错的地方莫过于指针了,指针问题主要有两类,一是内存泄露,二是无 ...

  5. js动画学习(一)

    一.运动框架实现思路 1.匀速运动(属性值匀速变化)(改变 left, right, width, height, opacity 等): 2.缓冲运动(属性值的变化速度与当前值与目标值的差成正比): ...

  6. Implement custom foreach function in C#

    http://msdn.microsoft.com/en-us/library/System.Collections.IEnumerator.aspx http://support.microsoft ...

  7. HTML之框架(frameest、ifram)

    1.frameset 最外层的去掉body用frameset <frameset rows="100,*"> 上下排版拆开,第一行高度占100,第二行*占剩下的 :co ...

  8. ubuntu中彻底删除nginx

    1.先执行一下命令: 1.1 删除nginx,–purge包括配置文件 sudo apt-get --purge remove nginx 1.2 自动移除全部不使用的软件包 sudo apt-get ...

  9. JavaSE学习总结第15天_集合框架1

      15.01 对象数组的概述和使用 public class Student { // 成员变量 private String name; private int age; // 构造方法 publ ...

  10. git 使用详情

    一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...