14

私はこのコードを使用しています

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)])
    {
        [self presentViewController:navigationControllerCustom animated:YES completion:nil];
    }
    else
    {
        [self presentModalViewController:navigationControllerCustom animated:YES];
    }

私のアプリケーションには、縦向きと縦向きの 2 つの向きがあります。このコードは iOS 5.1 ではうまく機能しますが、向きは iOS 6 では機能しません。

navigationControllerCustomクラスにもこのコードを追加しました

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
}

-(NSUInteger)supportedInterfaceOrientations
{
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);
}

この問題を解決するために私を助けてください。

前もって感謝します。

4

5 に答える 5

25

これをアプリケーション デリゲートに含める必要があります。

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

また、View Controller の両方に次のものがあることを確認してください。私にとっては問題なく動作します。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

ドキュメントには、UINavigationController'sサポートされている向きについて最上位のView Controllerを照会しないとも書かれていますが、開発者フォーラムのAppleエンジニアはそう言っていました...そうではないようです. したがって、 のカテゴリを追加する必要がありますUINavigationController。これは私が使用するものです。

#import "UINavigationController+autorotate.h"

@implementation UINavigationController (autorotate)

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

@end

AutoRotate が iOS 6 でどのように機能するかについては、この回答をご覧ください。

于 2012-10-03T16:09:46.510 に答える
2

あなたが忘れてしまった:

- (BOOL)shouldAutorotate {
    return YES;
}
于 2012-09-24T16:26:50.893 に答える
1

UINavigationControllerをサブクラス化し、shouldAutorotateおよびsupportedInterfaceOrientationsを次のようにオーバーライドします。

-(BOOL)shouldAutorotate
{
    return self.topViewController.shouldAutorotate;
}

-(NSUInteger)supportedInterfaceOrientations
{
     return self.topViewController.supportedInterfaceOrientations;
}

これで、各ViewControllerの向きを制御できます。各ViewControllerの2つのメソッドをオーバーライドするだけです。

于 2013-02-08T07:15:33.607 に答える
1

すべてのビュー コントローラーの回転を有効または無効にする場合は、UINavigationController をサブクラス化する必要はありません。代わりに次を使用します。

   -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

AppDelegate で。

アプリですべての向きをサポートするが、PARENT ビュー コントローラー (UINavigationController スタックなど) で異なる向きをサポートする予定がある場合は、使用する必要があります。

   -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

親View Controllerの次のメソッドと組み合わせて。

    - (BOOL)shouldAutorotate

- (NSUInteger)supportedInterfaceOrientations

ただし、同じナビゲーション スタック (私のように) 内の異なる CHILDREN ViewController で異なる方向設定を行う予定がある場合は、ナビゲーション スタック内の現在の ViewController を確認する必要があります。

UINavigationController サブクラスで次のものを作成しました。

    - (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    int interfaceOrientation = 0;

    if (self.viewControllers.count > 0)
    {
        id viewController;
        DLog(@"%@", self.viewControllers);
        for (viewController in self.viewControllers)
        {
            if ([viewController isKindOfClass:([InitialUseViewController class])])
            {
                 interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
            }
            else if ([viewController isKindOfClass:([MainViewController class])])
            {
                 interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
            }
            else
            {
                 interfaceOrientation = UIInterfaceOrientationMaskAllButUpsideDown;
            }
        }
    }
    return interfaceOrientation;
}

子ViewControllersから提示されたView Controllerの回転設定を制御することはできなくなるため、現在ナビゲーションスタックにあるView Controllerを何らかの方法でインターセプトする必要があります。それが私がしたことです:)。それが役立つことを願っています!

于 2013-01-20T00:28:24.693 に答える
1

そのスニペットをコードの上にコピーして貼り付けるだけです

@implementation UINavigationController (rotation)
//temp hack for iOS6, this allows passing supportedInterfaceOrientations to child viewcontrollers.
- (NSUInteger)supportedInterfaceOrientations {
return [self.topViewController supportedInterfaceOrientations];
}

@end
于 2012-10-03T16:12:32.563 に答える