7

UINavigationController 内にマスター ビュー コントローラーがあります。そのマスター ビュー コントローラーには、内部に UIWebView を持つ詳細ビュー コントローラーをプッシュするボタンがあります。この詳細ビュー コントローラーがロードされたときにランドスケープ モードにする必要があります。マスター ビュー コントローラーに戻ると、再び強制的にポートレート モードに戻ります。これでiOS 6を実行しています。

他の同様の質問を見たことがありますが、私の側ではうまくいきません。これらのメソッドを記述した UIViewController のサブクラスである LandscapeViewController を作成しました。

#pragma mark - Orientation Methods
- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

- (BOOL)shouldAutorotate
{
    return YES;
}

これは、詳細ビュー コントローラーをプッシュしたときのコードです。

DetailViewController *detailVC = [[DetailViewController alloc]
                                      initWithNibName:@"DetailViewController"
                                      bundle:nil];

    [self.navigationController pushViewController:detailVC
                                         animated:YES];

上記のコードでLandscapeViewControllerをサブクラス化して機能させる場所、または詳細ビューコントローラーを適切にサブクラス化してプッシュする方法を考えています。ナビゲーション コントローラーが詳細ビュー コントローラーを縦向きから横向きにプッシュできない場合は、詳細ビュー コントローラーをモーダルに表示することもできます。どこで間違っていますか?

4

2 に答える 2

8

考慮事項: ビュー A: 縦のみ - ビュー B: 横のみ

ナビゲーションコントローラーではできませんでした。代わりに、ビュー A からビュー B へのモーダル ビューを開き、新しいナビゲーション コントローラーをこのビューに強制しました。

これは、iOS5以降で機能しています。

次のように、ナビゲーション コントローラーのカテゴリを作成する必要があります。

UINavigationController+Rotation_IOS6.h

#import <UIKit/UIKit.h> 

@interface UINavigationController (Rotation_IOS6)

- (BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;

@end

UINavigationController+Rotation_IOS6.h

#import "UINavigationController+Rotation_IOS6.h"

@implementation UINavigationController (Rotation_IOS6)

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

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

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [self.topViewController preferredInterfaceOrientationForPresentation];
}

@end

AppDelegate.mに以下を追加します。

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    return UIInterfaceOrientationMaskAll;
}

次に、ビュー Aで:

- (BOOL)shouldAutorotate {
    return YES;
}

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

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

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

また、ビュー A でビュー B を開くには、次の操作を行います。

ViewB *vc = [[ViewB alloc] initWithNibName:@"ViewB" bundle:nil];

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:vc];

[self presentViewController:navigationController animated:YES completion:nil];

そして最後に、ビュー Bで

- (BOOL)shouldAutorotate {
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeRight;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}
于 2012-12-18T13:56:02.527 に答える
0

彼らはこれに関してiOS6の犬をちょっとねじ込んだ。これが私がこれまでに理解したことです:

まず、AppleはXcode4.5で「サポートされているインターフェイスの向き」ボタンを追加しました。これは、_info.plistの「サポートされているインターフェイスの向き」属性に対応します。これらのボタンは、残りのボタンが機能する前に、正しい選択に切り替える必要があります。(ボタンが切り替えを拒否しているように見える場合は、info.plistがCVSまたはその他のプロセスによってロックされている可能性があります。)

次に、プロパティ.window.rootViewControllerを設定し、スタック内の「最下部」のビューコントローラーを指す必要があります。通常、これはナビゲーションコントローラーまたはタブコントローラーのいずれかになります。

すべての回転を無効にしたい場合は、ボタンを使用してこれを行うか、「下部」のビューコントローラで「shouldAutorotate」メソッドを実装してNOを返すことができます。(メソッドが省略された場合、デフォルトはYESです。)

shouldAutorotateで自動回転を無効にしているにもかかわらず、MPMoviePlayerViewControllerが表示されている場合は、自動回転します。これを防ぐために、サポートされているインターフェイスの向きボタンを切り替えるだけで表示されます。

他のViewControllerを条件付きで自動回転させたい場合は、混乱します。基本的に、「下部」のビューコントローラは、supportedInterfaceOrientationsメソッドを実装し、現在のtopViewControllerに基づいて適切なビットマスクを返す必要があります。これは、topViewControllerの古い「shouldAutorotateToInterfaceOrientation」メソッドを照会するルーチンを使用して実行できますが、少し見苦しいです。このスキームでは回転ビューコントローラーのコードを変更する必要はありませんが、「supportedInterfaceOrientation」を実装するには、回転したビューのすぐ下のVCを変更する必要があります。そうしないと、ビューが戻ったときに回転します。(少なくともこれは単純なコピー/貼り付けです。)しかし、より良い、より一般的なスキームを思いついた人はいないようです。

于 2012-12-14T03:37:05.307 に答える