[iOS] iOS 6的Rotation

來源:互聯網
上載者:User

iOS 6的rotation改變了很多。先來看看官方的描述 

http://www.bgr.com/2012/08/06/ios-6-beta-4-change-log-now-available/

知識點:

*UIViewController的shouldAutorotateToInterfaceOrientation方法被deprecated。在ios6裡,是使用supportedInterfaceOrientations and shouldAutorotate 2個方法來代替shouldAutorotateToInterfaceOrientation。注意:為了向後相容iOS 4 and 5,還是需要在你的app裡保留shouldAutorotateToInterfaceOrientation。

for ios 4 and 5, 如果沒有重寫shouldAutorotateToInterfaceOrientation,那麼對於iphone來講,by default是只支援portrait,不能旋轉。

for ios 6, 如果沒有重寫shouldAutorotate and supportedInterfaceOrientations,by default, iphone則是"可以旋轉,支援非upside down的方向",而ipad是"可以選擇,支援所有方向"

example 1: for ios 4 and 5, iphone device, 若要"可以旋轉,支援非upside down的方向",則可以在view controller裡

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {return (interfaceOrientation != UIDeviceOrientationPortraitUpsideDown);}

example 2: for ios 6, iphone device, 若要“不能旋轉,只支援portait",則可以在view controller裡

- (BOOL)shouldAutorotate{    return NO;}

example 3: for ios 6, ipad device, 若要“可以旋轉,只支援landscape",則可以在view controller裡

-(NSUInteger)supportedInterfaceOrientations{    return UIInterfaceOrientationMaskLandscape;}- (BOOL)shouldAutorotate{    return YES;}

* 在iOS 4 and 5,都是由具體的view controller來決定對應的view的orientation設定。而在iOS 6,則是由top-most  controller來決定view的orientation設定。

舉個例子:你的app的rootViewController是navigation controller "nav", 在”nav"裡的stack依次是:main view -> sub view > sub sub view,而main view裡有一個button會present modal view "modal view".

那麼for ios 4 and 5,在ipad裡,如果你要上述view都僅支援橫屏orientation,你需要在上面的main view, sub view, sub sub view, model view裡都添加

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation==UIInterfaceOrientationLandscapeRight);}

而對於iOS6, 由於是由top-most controller來設定orientation,因此你在main view, sub view, sub sub view裡添加下面的代碼是沒有任何效果的,而應該是在nav controller裡添加下列代碼。而modal view則不是在nav container裡,因此你也需要在modal view裡也添加下列代碼。

-(NSUInteger)supportedInterfaceOrientations{    return UIInterfaceOrientationMaskLandscape;}- (BOOL)shouldAutorotate{    return YES;}

注意:

*你需要自訂一個UINavigationController的子類for "nav controller",這樣才可以添加上述代碼。

* 和navigation controller類似,tab controller裡的各個view的orientation設定應該放在tab controller裡

for ios6的top-most controller決定orientation設定,導致這樣一個問題:在 top-most controller裡的views無法擁有不相同的orientation設定。例如:for iphone, 在nav controller裡,你有main view, sub view and sub sub view,前2個都只能打豎,而sub sub view是用來播放video,可以打橫打豎。那麼在ios 4 and 5裡可以通過在main view and sub view的shouldAutorotateToInterfaceOrientation裡設定只能打豎,而在sub
sub view的shouldAutorotateToInterfaceOrientation設定打豎打橫即可。而在ios 6裡則無法實現這種效果,因為在main view, sub view and sub sub view的orientation設定是無效的,只能夠在nav controller裡設定。那麼你可能想著用下列代碼在nav controller裡控制哪個view打豎,哪個view打橫

-(NSUInteger)supportedInterfaceOrientations{    if([[self topViewController] isKindOfClass:[SubSubView class]])        return UIInterfaceOrientationMaskAllButUpsideDown;    else        return UIInterfaceOrientationMaskPortrait;}

是的,這樣可以使得在main view and sub view裡無法打橫,而sub sub view橫豎都行。但問題來了,如果在sub sub view時打橫,然後back to sub view,那麼sub view是打橫顯示的!

目前想到的解決方案只能是把sub sub view脫離nav controller,以modal view方式來顯示。這樣就可以在modal view裡設定打橫打豎,而在nav controller裡設定只打豎。

* 說了那麼多,其實如果你的app的所有view的orientation的設定是統一的,那麼你可以簡單的在plist file裡設定即可,不用添加上面的代碼。而如果你添加了上面的代碼,就會覆蓋plist裡orientation的設定。

* in iOS 6, 當view controller present時,不會call willRotateToInterfaceOrientation:duration:, willAnimateRotationToInterfaceOrientation:duration:, and didRotateFromInterfaceOrientation: methods,只有在發生rotate的時候才會call

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.