#iOS系統自帶的 UIAlertView 自動旋轉的實現html
這裏主要解析 UIAlertView 的幾個關鍵功能的實現:ios
實現源碼參考: http://git.oschina.net/shede333/BMAlertHudgit
###使用UIWindowapp
彈出一個Alert框,最好新建一個 UIWIndow,ide
[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
;UIInterfaceOrientationMaskAllButUpsideDown
重寫以上兩個函數,便可實現屏幕的旋轉與否。動畫
####屏幕旋轉時,控件位置自定義.net
UIViewController兩個系統函數,但在iOS8上被放棄了,主要是實現:屏幕旋轉時,子VIew佈局位置的更改,這裏區分一下:code
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
這函數是被放在屏幕旋轉動畫的 Animation-Block 裏,因此,這裏對子View作的任何改變,都會動畫的實現,屏幕旋轉時,要自定義改變子View的位置,就在這裏實現。
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
重寫這個函數,裏面的代碼的實現不會動畫,建議屏幕旋轉時,須要把相似禁止View的觸摸事件、中止音樂播放等動做放在此處;
###適配問題
這裏要區分iOS六、7 和 iOS8 的區別:
屏幕 Screen的Size : [[UIScreen mainScreen] bounds].size
在iOS六、7 隨着屏幕的旋轉,Screen的Size,以及相關UIViewController的view的長寬是 不變的,即高 老是大於 寬;
在iOS8上,隨着屏幕的旋轉,Screen的Size,以及相關UIViewController的view的長寬是 改變的,
因此,須要設置AlertView隨屏幕的旋轉而旋轉的話,考慮到適配iOS六、七、8,須要作如下設置:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
這個函數裏實現:屏幕旋轉時,設置子View的位置, 注意Screen的Size在ios8上是會改變的。其實iOS8上對屏幕旋轉的支持很好,咱們只須要把子view的autoresizingMask
設置好,就會達到咱們須要的效果;
可是在iOS六、7上,咱們隊子View的更改,大部分工做都須要在- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
裏主動設置子view;
###參考
實現源碼參考: http://git.oschina.net/shede333/BMAlertHud #iOS系統自帶的 UIAlertView 自動旋轉的實現