0

ユーザーがアプリ内のどこにいるかに応じて、サポートされている向きを定義しようとしていますが、そうするのは非常に困難です。

これまでのところ、iOS6 でサポートされるようになった supportedInterfaceOrientationsForWindow: および shouldAutorotate メソッドを使用する必要があることがわかりましたが、どちらのメソッドも、UIViewController で定義している場所では呼び出されません。

これは私のコードがどのように見えるかです

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientationsForWindow {
    return UIInterfaceOrientationMaskPortrait;
}

私の Target Summary Supported Orientatoin では、すべてのオプションの選択を解除しました.. m ViewControllers のそれぞれでサポートされている向きを定義するだけだと考えています...これが正しいことかどうか知りたいですか?

ここに画像の説明を入力

今、私がやろうとしていることはアプリの構造に依存していることを読んだので、ここでアプリの概要を説明します。

  • main UIViewController ((3 つの異なる navigationControllerViews) に移動する 3 つのボタンが間違っています! navigationController が 1 つだけです... このコードを見てから長い時間が経ちました。)
  • セカンダリ UIViewController (ナビゲーション コントローラーを保持)
  • その他の UIViewControllers (セカンダリ NavigationController に表示されます)

NavigationController スタックの最後の ViewController まで、すべての ViewController が portrate に表示されるようにしたいと思います。NavigationController の最後のビューは、必要に応じて向きを左または右に回転できる必要がある特別なビューです。

これが可能かどうかを知りたいのですが、可能であれば、上記のコードが機能していない/呼び出されていないのはなぜですか。

どんな助けでも大歓迎です。

// 質問への更新 Re:

RootView のロード (3 つのボタン。ナビゲーション コントローラーを含むビューをロードするためにボタンが選択されたときに呼び出されるメソッド)

- (IBAction)buttonClick: (UIButton *) sender
{   
//..

    // v ----->
    if ([sender isEqual:vUIButton]) {


        VSearchViewController *vSearchViewController = [[VSearchViewController alloc] initWithNibName:@"VSearchViewController" bundle:nil];
        [self.navigationController pushViewController:vehicalSearchViewController animated:YES];
    }
//..
}

次に、VSearchViewController 内で、新しいビューを次のように UINavigation スタックにロードします

//..
FModelsViewController *fModelsViewController = [[FModelsViewController alloc] initWithNibName:@"FModelsViewController" bundle:nil];

            // Sets the back button for the new view that loads (this overrides the usual parentview name with "Back")
            self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStyleBordered target:nil action:nil];

            [self.navigationController pushViewController:fModelsViewController animated:YES];
//..

したがって、レビューでは、appDelegate にナビゲーション コントローラーを設定し、アプリのすべてのビューが navigationStack にあります。NavigationController が 3 つあると言うのは間違っていました。申し訳ありません..このコードを見てから1年半が経ちました..

4

2 に答える 2

1

上記のコードを iOS6 で実行していますか? これらのメソッドは iOS6 でのみ呼び出されます。

また、ビュー階層をよりよく理解できるように、これらの viewController にどのように移行しているかをよりよく示すために、いくつかのコードを投稿することもできます。

UIViewController のaddChildViewController:メソッドを見たいと思うかもしれません。

于 2013-03-13T21:37:18.217 に答える
0

あなたの最後のビューは、以下に書かれたコードを利用できると思います。デバイスの向きを感知し、横向きのビュー用に別のビューコントローラーを表示します(これがあなたがやろうとしていることだと思います)。これは、最後のビューに縦向きと横向きのオプションがあることを意味します。

@implementation LastViewController

- (void)awakeFromNib
{
isShowingLandscapeView = NO;
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                        selector:@selector(orientationLastViewChanged:)
                        name:UIDeviceOrientationDidChangeNotification
                        object:nil];
}
- (void)orientationLastViewChanged:(NSNotification *)notification
{

UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
!isShowingLandscapeView)
{
[self performSegueWithIdentifier:@"LandscapeLastView" sender:self];
isShowingLandscapeView = YES;
}
else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&
    isShowingLandscapeView)
{
[self dismissViewControllerAnimated:YES completion:nil];
isShowingLandscapeView = NO;

}

}

ポートレートにロックするこのビューにつながるビューコントローラで、次のコードを記述します。

- (BOOL)shouldAutorotate {
return NO;
}

サポートされているインターフェイスの向きについては、そのままにしておきます。

于 2013-03-13T21:47:54.780 に答える