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

Posted Hakim_Fan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS系统自带的 UIAlertView 自动旋转的实现相关的知识,希望对你有一定的参考价值。

这里主要解析 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 自动旋转的实现的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 7 中显示 UIAlertView 时出现旋转问题

iPhone iOS8:从 iOS7.1 sdk 构建并在 8.0 及更高版本的设备上运行时,UIAlertView 倒置旋转无法正常工作

iOS实现屏幕旋转

UIAlertView 自动关闭后导航栏色调颜色发生变化

防止 AlertView 自动旋转

iOS--UIAlertView与UIAlertController和UIAlertAction之间的事儿