IOS6屏幕自動旋轉設置測試


結論如下:

1> 如果是在rootViewController中添加了方向控制,則他的子視圖都默認繼承rootViewController的方向控制

子視圖的解釋是:

1 如果rootviewcontroller是普通的uiviewcontroller,則通過presentViewController方法進來的也都叫做子視圖,同時這種方法也受到info.plist的限制,他們是繼承關系,也可以覆蓋父類設置,但是覆蓋范圍只能越來越小

 

2 >如果rootViewController是導航UINavigationController,又有2種情況:

1通過push,進來的各種子頁面,則必需在navigation bar 這個跟上設置旋轉,這種可能只能通過category來操作它了,而且各個子頁面也繼承了父類設置,子頁面自己不能單獨設定,除非UINavigationController把控制權交給了每個子頁面,則子頁面可以單獨設定,但是和父類的設定也是繼承關系,也可以覆蓋父類設置,但是覆蓋范圍只能越來越小

2 presentViewController進來的各種子頁面,則只能自己單獨設定了,和UINavigationController設定沒有任何繼承關系,也沒有任何聯系

3 >可以在uiWindow上直接添加子視圖,這樣的視圖不受info.plist限制

 

測試結果:

1>plist中,supported interface Orientations中,程序打開默認的方向,與這里面設置的先后順序無關!和打開時候,設備當時的方向有關

2> 如果在程序中沒有做任何方向設置,則單純的只在supported interface Orientations設置是對所有頁面都生效的

3>info.plist設置所有方向都支持,然后在rootViewController中設置shouldAutorotate為NO,則根本就不會旋轉,而且默認打開方向也是豎屏的,說明這個設置會覆蓋info.plist設置

4>info.plist設置所有方向都支持,然后在rootViewController中設置shouldAutorotate為YES,而且設置

-(NSUInteger)supportedInterfaceOrientations{

    return UIInterfaceOrientationMaskAllButUpsideDown;

}

測試結果:按鈕朝上時候,屏幕不再旋轉

3,4說明程序里的設置會覆蓋info.plist的設置

5>設定info.plist只支持橫屏(landscape Left,landscape Right),然后在rootViewController中設置shouldAutorotate為YES,而且設置

-(NSUInteger)supportedInterfaceOrientations{

    return UIInterfaceOrientationMaskAllButUpsideDown;

}

這時候發現屏幕只能在橫屏模式下工作

3,4,5三點測試說明,info.plist設置是生效的,如果info.plist旋轉方向設置的范圍大,則可以在代碼中設置更小的范圍,如果info.plist設置的范圍小,在代碼中再擴大范圍,也是無效的

6>在5的基礎上,在第一個頁面加一個按鈕,點擊進入第二個頁面(SecondPage)

  1.第二個頁面什么都不設置,發現第二個頁面的旋轉,繼承了rootViewController的設置,只能橫屏

  1. SecondPage設置shouldAutorotate為NO,發現第一個頁面可以正常旋轉,到第二個頁面就不旋轉了,說明接下來的設置還是會覆蓋rootViewController的設置!
  2. SecondPage設置shouldAutorotate為YES,然后設置
  3. -(NSUInteger)supportedInterfaceOrientations{     return UIInterfaceOrientationMaskLandscapeLeft;}

發現第一個頁面可以正常旋轉,到第二個頁面只能是left方向

  1. 在4點基礎上,設置-(NSUInteger)supportedInterfaceOrientations{     return UIInterfaceOrientationMaskAll;}發現第二個頁面只能左右,並不能4個方向都任意旋轉

2,3,4三小點,說明了present的情況下,子頁面會繼承父頁面的設置,同時子頁面也可以覆蓋父頁面的設置,但是覆蓋的范圍只能是越來越小,不能越來越大

 

上面測試的是普通的rootViewController,在正常present的情況下,如果是UINavigationController下,用push呢

開始測試UINavigationController的push情況

上面測試結果不一樣了,發現凡是push進來的頁面,包括一開始在appDelegate中初始化的UINavigationController

第一個controller,類似這樣

[[UINavigationController alloc] initWithRootViewController:firstPage

在firstPage,和secondPage里設置旋轉都是無效的

說明了IOS6旋轉只能在根controller下旋轉, UINavigationController這種情況下,根是UINavigationController,不是firstPage!

因此我們添加UINavigationController的category來來解決旋轉設置

我們添加一個UINavigationController+Rotate文件

然后在里面設置

-(BOOL)shouldAutorotate

{

    return NO;

}

發現不旋轉了,只有豎屏了,說明生效了

 

然后我們在info.plist里面設置支持所有方向,然后在UINavigationController+Rotate.m的里面設置

-(BOOL)shouldAutorotate

{

    return YES;

}

-(NSUInteger)supportedInterfaceOrientations

{

    return UIInterfaceOrientationMaskLandscape;

}

發現只有橫屏生效,說明同樣的,這個設置覆蓋了info.plist設置,並且只能越來越小范圍的覆蓋

 

繼續修改:

-(NSUInteger)supportedInterfaceOrientations

{

    return [self.topViewController supportedInterfaceOrientations];

}

 

-(BOOL)shouldAutorotate

{

    return [self.topViewController shouldAutorotate];

}

這樣設置,就相當於把設置權給下面的具體子視圖了,因為每個子視圖可以根據自己的情況,自己設定自己的旋轉方向去

 

如果是UINavigationController下,用present添加子頁面呢?

如果是push情況下,如果UINavigationController+Rotate沒把具體控制權給子頁面,則子頁面設置都是無效的

但是如果用present添加子頁面,則子頁面里添加控制權就是生效的,而且不再繼承UINavigationController+Rotate的任何設置

 

結論:

普通的rootViewController,添加子頁面也就是通過present方法添加,這時候生效是這樣的

info.plist---> rootViewController--->subview的設置,他們的設置是繼承關系,但可以覆蓋,但是覆蓋設置的范圍只能越來越小

 

如果rootViewController是UINavigationController,UITabController,則有2種可能

1 push進來的子頁面,這時候設置旋轉只能通過UINavigationController的Category來設定,子頁面自己設定無效.當然UINavigationController的Category也可以把控制權交給具體的子頁面來設定,這種情況也是這樣的

info.plist---> UINavigationController--->subview,他們是繼承關系,並且范圍只能設定越來越小

2 present進來的頁面,這時候present進來的頁面不受UINavigationController設定的控制,也不再存在繼承關系,需要自己單獨設定是否旋轉,以及旋轉方向

另外兼容ios5:

ios5屏幕旋轉比較簡單,沒有iofo.list的支持和限制,因此ios5下設置info.plist是無效的

ios5只需要在想旋轉的頁面,設置一個方法

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

}

即可,其中可旋轉的項有

UIInterfaceOrientationPortrait//垂直
UIInterfaceOrientationPortraitUpsideDown//倒轉
UIInterfaceOrientationLandscapeLeft//home左
UIInterfaceOrientationLandscapeRight//home右

因此兼容ios5需要在頁面上分別進行設置

歡迎學習IOS的朋友請加ios技術交流群:190956763,共同學習,共同進步!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM