iOS系统自带的 **UIAlertView** 以及 屏幕自动旋转的实现
2015-05-21 10:52
471 查看
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的触摸事件、停止音乐播放等动作放在此处;
> * ios4,ios5 IOS6屏幕旋转详解orientation(自动旋转、手动旋转、兼容IOS6之前系统)
适配问题
这里要区分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/BMAlertHudiOS系统自带的 UIAlertView 自动旋转的实现
相关文章推荐
- iOS系统自带的 UIAlertView 自动旋转的实现
- iOS 开发,屏幕旋转、旋转屏幕collectionView cell 的自动布局问题
- [iOS]技巧集锦:UICollectionView在旋转屏幕后Cell中的约束不起作用或自动布局失效
- iOS WKwebview自动实现缩放网页适应屏幕和侧滑返回上个页面
- Android进阶——自定义View之继承系统控件实现自带删除按钮动画效果和软键盘自动悬浮于文本框下方
- ios6.0之后单个屏幕旋转,不用根视图以及Application windows are expected to have a root view controller at the end of
- android怎样实现关闭系统自动旋转屏幕时能够自动横竖屏
- IOS屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)
- iOS UITableView:section的Header以及Footer不悬浮停留在屏幕的方法(非在scrollView代理实现的方法)
- iOS 自带三种提示框使用、UIAlertView以及UIAlertController的使用
- iOS开发:调用系统自带相机以及获取相册照片的功能实现
- iOS 自定义view 如何不使用self.view也就是系统自带的 view,使用自己定制的view
- iOS JS 交互之利用系统JSContext实现 JS调用OC方法以及Objective-C调用JavaScript方法
- 【代码笔记】iOS-UIAlertView自动关闭
- 【代码笔记】iOS-UIAlertView自动关闭
- iOS UIAlertView自动关闭功能
- iOS—在tableView上实现始终在屏幕底部有一个button的效果
- Android客户端之“微服私访”App的系统学习(五)使用Picasso实现轮播图以及使用自定义View实现个人中心页面
- iOS 强制屏幕实现旋转功能,超级简单。
- IOS UIScrollView实现自动轮播图功能