7

私は、ナビゲーションコントローラーのビューコントローラーが異なる方向規則を持つことを許可するという前の質問に従おうとしています。前の質問

たとえば、2つのビューコントローラがあります。最初はウェルカムセカンドホームです。最初のビューコントローラをPotraitのみにし、2番目(ホーム)をポート/ランドスケープの両方に許可したいと思います。

これを完了する方法を完全に理解しているかどうかはわかりません。完了したら、これを行う方法を説明する別のプロジェクトを作成し、将来の参照用に質問にGithub/shareに追加する予定です。

この特定のプロジェクトでは、サイドビューコントローラーのgithubプロジェクトを使用しています。PPRevealSideViewController。

私のアプリデリゲートは次のとおりです。

// Then we setup the reveal side view controller with the root view controller as the navigation controller
welcomeViewController = [[MESWelcomeViewController alloc] init];
UINavigationController *navController = [[MESNavViewControllerSubClass alloc] initWithRootViewController:welcomeViewController];


self.revealSideViewController = [[PPRevealSideViewController alloc] initWithRootViewController:navController];
[self.revealSideViewController setDirectionsToShowBounce:PPRevealSideDirectionNone];
[self.revealSideViewController setPanInteractionsWhenClosed:PPRevealSideInteractionContentView | PPRevealSideInteractionNavigationBar];

//self.window.rootViewController = welcomeViewController;
self.window.rootViewController = self.revealSideViewController;
[self.window makeKeyAndVisible];

上記から、ナビゲーションコントローラーをMESNavViewControllerとしてサブクラス化したことがわかります。これはこのファイルの私の頭です:

@interface MESNavViewControllerSubClass : UINavigationController {
    BOOL setLandscapeOK;
}

MESNavViewControllerのImpファイル:

-(void)viewDidLoad {
    NSLog(@"subclass called");
}

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if (self->setLandscapeOK) {
        // for iPhone, you could also return UIInterfaceOrientationMaskAllButUpsideDown
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskPortrait;
}

私の最初の(ようこそ)View Controllerには、次のものがあります。

-(void)viewWillAppear {
    BOOL setLandscapeOK = NO;
}
- (NSInteger)supportedInterfaceOrientations {
    // Restriction for the welcome page to only allow potrait orientation
    return UIInterfaceOrientationMaskPortrait;
}

私の2番目の(ホーム)Viewコントローラーには、次のものしかありません。

-(void)viewWillAppear {
    BOOL setLandscapeOK = YES;
}

私が見ているのは、ナビゲーション内の両方のビューコントローラーがどちらの方向も許可していることです。正しく理解できているかわかりません。うまくいけば、私は十分な情報を提供しました。

編集-----最上位のコントローラーであるPPRevealSidePanelサブクラスを更新しました。次に、これはnavコントローラーを保持し、navコントローラーはviewコントローラーを保持します。向きは、表示されるビューコントローラによって決定する必要があります。

PPRevealSidePanelサブクラス- ここに画像の説明を入力してください

次に、実際のView Controllerで、このサブクラスのセッターsetLandscapeOKを更新しようとするとエラーが発生します。ログインビューコントローラ- ここに画像の説明を入力してください

4

3 に答える 3

2

navコントローラーでオリエンテーションを処理する方法について説明している以下のスレッドを確認できますか

NavControllerは自動回転する必要があります

-anoop

于 2013-02-19T10:28:46.190 に答える
0

viewWillAppearメソッドが呼び出されていますか?実際の方法は- (void)viewWillAppear:(BOOL)animatedです。

それとは別に、問題は、supportedInterfaceOrientationsがviewWillAppearの前に呼び出されることです。initWithNibNameメソッドでBOOLフラグを設定してみてください。

編集:

このようなもの:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.setLandscapeOK = YES;
    }
    return self;
}

編集2:

viewWillAppearでsetLandscapeOKを新しい変数として再宣言していることに気づきました。これは、その変数のスーパークラスのインスタンスを非表示にしています。BOOLsetLandscapeOKの代わりにself.setLandscapeOKを使用してみてください

編集3:

メインのnavコントローラーをサブクラス化していないため、上記のものは機能しません。サブビューが特定の方向をサポートすることを望まないことをナビゲーションコントローラーに通知する明示的な方法が必要になります。縦向きのみのビューコントローラを押す場合は、setLandscapeOKをNOに設定する必要があります。

于 2013-02-07T22:47:50.530 に答える
0

あなたの場合にうまくいかないのは、そのUINavigationControllerサブクラスで-supportedInterfaceOrientationsをオーバーライドしているため、メソッドがその子ViewControllersに渡されないことです。また、グローバルなものを変更するのではなく、viewWillAppearで新しいsetLandscapeOKBOOLを宣言しています。奇妙なことに、UINavigationControllerサブクラスでsetLandscapeOKブール値をYESに設定することは決してないように思われるため、アプリを投稿したコードに基づいて、すべての方向を許可せずに、縦向きに固定する必要があります。

しかし、あなたは物事を本来よりもはるかに複雑にしているようです。そのsetLandscapeOKブール値は必要ありません。また、回転の問題のためだけにUINavigationControllerまたはPPRevealSideViewControllerをサブクラス化する必要はありません。PPRevealSideViewControllerとUINavigationControllerはどちらも、子ViewControllerを含む親ViewControllerとも呼ばれるコンテナViewControllerです。デフォルトでは、親ViewControllerでオリエンテーションコールバックが呼び出されると、子ViewControllerと同じメソッドが呼び出されて返されます。

PPRevealSideViewControllerで-shouldAutoRotate、-supportedInterfaceOrientations、または-shouldAutoRotateToInterfaceOrientationが呼び出されると、rootViewController(この場合はUINavigationController)で同じメソッドが呼び出されます。UINavigationControllerはコンテナViewControllerでもあり、現在表示されているViewController(この場合はWelcomeViewControllerまたはHomeViewController)で同じメソッドを呼び出します。

したがって、必要なのは、WelcomeViewController(縦向きのみを返す)とHomeViewController(すべてを返す)で-supportedInterfaceOrientationsと-shouldAutoRotateToInterfaceOrientationをオーバーライドすることだけです。MESNavViewControllerでこれらのメソッドをオーバーライドしないでください。このサブクラスも必要ありません。他に何もする必要はありません。すべてのViewControllerでそのsetLandscapeOKブール値を削除することもできます。

于 2013-02-13T23:50:49.080 に答える