iOS系統自帶的 **UIAlertView** 以及 屏幕自動旋轉的實現

#iOS系統自帶的 UIAlertView 自動旋轉的實現html

這裏主要解析 UIAlertView 的幾個關鍵功能的實現:ios

  • 隨着設備屏幕的旋轉而旋轉;
  • Alert彈出框,使用UIWindow來實現,就是說,不用依賴於當前顯示在最前面的UIView。

實現源碼參考: http://git.oschina.net/shede333/BMAlertHudgit

###使用UIWindowapp

彈出一個Alert框,最好新建一個 UIWIndowide

  • 把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

重寫以上兩個函數,便可實現屏幕的旋轉與否。動畫

####屏幕旋轉時,控件位置自定義.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 自動旋轉的實現

相關文章
相關標籤/搜索