簡體   English   中英

在iOS7中處理一個視圖控制器的自動旋轉

[英]Handling autorotation for one view controller in iOS7

我已經閱讀了很多關於SO的答案,但我似乎無法在iOS7上進行自動旋轉。

我只需要一個視圖控制器來旋轉,所以我不想在我的Info.plist中設置旋轉設置。

據我了解Apple的文檔,單個視圖控制器可以通過簡單地覆蓋兩個方法來覆蓋全局旋轉設置(來自Info.plist)。 Info.plist設置為僅允許Portrait,我的視圖控制器實現以下方法:

- (NSUInteger)supportedInterfaceOrientations
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

- (BOOL)shouldAutorotate
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
    return true;
}

我在旋轉時看到那些NSLog語句但沒有旋轉。

如果我使用正確的旋轉設置配置Info.plist,我的視圖將旋轉,但如果我嘗試依賴我的視圖控制器則不會。

不確定它是否重要,但我試圖旋轉的視圖來自使用自動布局的.xib。

此外,我的ViewController以模態方式呈現,並包含在導航控制器中。 我試過單獨呈現視圖控制器,但這不起作用。 我也嘗試在UINavigationController中添加一個類別,以便從它的topViewController獲取它的自動旋轉方向。

就我而言,我有一個新的iOS7應用程序,已經創建了大約30個視圖控制器。 我只需要在一個模態視圖控制器上進行自動旋轉。 我不想更新預先存在的視圖控制器。

我在plist中選擇了我想要的方向:

選擇方向

然后我在UIViewController上為我的app委托添加了一個類別:

@implementation UIViewController (rotate)
   -(BOOL)shouldAutorotate {
      return NO;
   }
@end

然后在單模態視圖控制器中我想要旋轉我添加了這個方法:

-(BOOL)shouldAutorotate {
      return YES;
}

我還發現,如果我的視圖控制器不是模態VC,我需要在UINavigationController上添加類別方法,對於根視圖控制器之后的所有VC,作為視圖控制器的導航堆棧的一部分 - 類似於這個: https//stackoverflow.com/a/20283331/396429

簡單,但它工作得很好。 IOS 7.1和8

AppDelegate.h

@property () BOOL restrictRotation;

AppDelegate.m

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if(self.restrictRotation)
    return UIInterfaceOrientationMaskPortrait;
else
    return UIInterfaceOrientationMaskAll;
}

視圖控制器

-(void) restrictRotation:(BOOL) restriction
{
    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
    appDelegate.restrictRotation = restriction;
}

viewDidLoad中

[self restrictRotation:YES]; or NO

您需要將plist值設置為所有可能的值,然后根據需要限制它們(在Navigation Controllers和TabBar控制器中。來自UIViewController類描述:

在iOS 6及更高版本中,您的應用程序支持應用程序的Info.plist文件中定義的界面方向。 視圖控制器可以覆蓋supportedInterfaceOrientations方法以限制支持的方向列表。 通常,系統僅在窗口的根視圖控制器或呈現的視圖控制器上調用此方法以填充整個屏幕; 子視圖控制器使用由父視圖控制器為其提供的窗口部分,不再直接參與有關支持哪些旋轉的決策。 應用程序的方向遮罩和視圖控制器的方向遮罩的交點用於確定視圖控制器可以旋轉到哪些方向。

我遇到了這樣的問題 - 在我的應用程序中只有一個橫向視圖。 我用下面的代碼來處理它。

#import "objc/message.h"
-(void)viewWillAppear:(BOOL)animated{

objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationLandscapeLeft);
}

我知道這已經過時了,但我最終處於一個更獨特的情況,我們在整個應用程序中都有50多個ViewController,我拒絕通過修改並支持相同的方向,但只有一個或兩個。這讓我想到了我的答案。 我創建了一個覆蓋的UIViewController類別 - (BOOL)shouldAutorotate總是返回NO或YES,具體取決於設備類型等(這也可以通過支持的接口方向完成)。 然后在ViewControllers上我想支持更多然后只是肖像,我調到shouldAutorotate返回YES。 使用以下命令在父ViewControllers viewWillAppear方法中關閉視圖時強制更改方向:

[[UIDevice currentDevice] setValue:@(UIInterfaceOrientationPortrait) forKey:@"orientation"].

完成所有操作后,我在一些ViewControllers上完成了我想要的一切,其中包含<30行代碼,使用宏進行調配。 如果我通過在應用程序中的所有VC上替換shouldAutorotate和supportedInterfaceOrientations來完成它,我將有大約250行代碼。 並且首先添加了許多笨拙的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM