1

一度に 2 つのビュー コントローラーを表示するナビゲーション コントローラーがあります。それらは階層化されており、最前面のコントローラーを下にドラッグして、下のコントローラーを表示できます。私のアプリ デリゲートは、以下に示すように、背面のビューが表示されているときにのみアプリがインターフェイスの向きを許可するように構成されています。

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if (self.revealNavigationController.isViewRevealed)
    {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }

    return UIInterfaceOrientationMaskPortrait;
}

当然、これにより、デバイスを回転させるとフロント ビュー コントローラーとバック ビュー コントローラーの両方が回転しますが、バック ビュー コントローラーの回転のみに関心があります。一番前のView Controllerで回転を完全に無効にする方法はありますか?

4

3 に答える 3

0

axiixc によって提案された解決策は一般的に優れているため、問題によっては、彼の回答を確認する必要がありますしかし、これは私の問題を解決しませんでした。UINavigationControllerビューコントローラーのビューをインデックス0のサブビューとして挿入した. 次に、UINavigationBarドラッグ可能にして、下にドラッグすると背面のビューが表示されるようにしました。次に、最前面のビューがナビゲーション バーと共に移動します。axiixc で提案されているように、iOS 5 で導入されたビュー コントローラー コンテインメント API でこれを機能させることができませんでした。

代わりに、ナビゲーション コントローラーからビューを削除し、アプリの起動時に直接追加しUIWindow、このビューの回転を自分で処理し、他のすべてのビューで回転を無効にしました (つまり、ナビゲーション コントローラーで無効にしました)。

これは私がビューを追加した方法です-application:didFinishLaunchingWithOptions:

self.revealViewController = [[RevealViewController alloc] init];
[self.window insertSubview:self.revealViewController.view atIndex:0];

そして、その直後に に登録しましたUIDeviceOrientationDidChangeNotification

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];

didRotate:の見た目は次のようになります: (これは、StackOverflow に関する別の回答に触発されたもので、現在は再び見つけることができません。申し訳ありません)

- (void)didRotate:(NSNotification *)notification
{
    // Only rotate if the view is revealed
    if (self.revealNavigationController.isViewRevealed)
    {
        UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
        [self updateForDeviceOrientation:orientation animated:YES];
    }
}

電話する-updateForDeviceOrientation:animated:

- (void)updateForDeviceOrientation:(UIDeviceOrientation)orientation animated:(BOOL)animated
{
    CGFloat degrees = 0.0f;
    switch (orientation)
    {
        case UIDeviceOrientationLandscapeLeft:
            degrees = 90.0f;
            break;
        case UIDeviceOrientationLandscapeRight:
            degrees = -90.0f;
            break;
        case UIDeviceOrientationPortrait:
            degrees = 0.0f;
            break;
        default:
            break;
    }

    CGFloat duration = (animated) ? [UIApplication sharedApplication].statusBarOrientationAnimationDuration : 0.0f;

    __weak typeof(self) weakSelf = self;
    [UIView animateWithDuration:duration animations:^{
        // Rotate view
        weakSelf.revealViewController.view.transform = CGAffineTransformIdentity;
        weakSelf.revealViewController.view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(degrees));

        // Resize view for rotation
        CGFloat width, height;
        if (UIDeviceOrientationIsLandscape(orientation))
        {
            width = MAX(CGRectGetWidth(weakSelf.revealViewController.view.bounds), CGRectGetHeight(weakSelf.revealViewController.view.bounds));
            height = MIN(CGRectGetWidth(weakSelf.revealViewController.view.bounds), CGRectGetHeight(weakSelf.revealViewController.view.bounds));
        }
        else
        {
            width = MIN(CGRectGetWidth(weakSelf.revealViewController.view.bounds), CGRectGetHeight(weakSelf.revealViewController.view.bounds));
            height = MAX(CGRectGetWidth(weakSelf.revealViewController.view.bounds), CGRectGetHeight(weakSelf.revealViewController.view.bounds));
        }

        CGSize newSize = CGSizeMake(width, height);

        CGRect viewBounds = weakSelf.revealViewController.view.bounds;
        viewBounds.size = newSize;
        weakSelf.revealViewController.view.bounds = viewBounds;

        CGRect viewFrame = weakSelf.revealViewController.view.frame;
        viewFrame.size = newSize;
        weakSelf.revealViewController.view.bounds = viewFrame;
    }];
}
于 2013-05-03T08:01:24.857 に答える