web-dev-qa-db-ja.com

iOS6インターフェイスの向きの変更を理解する

追加:私の質問は賛成票なしで頻繁に表示されるので、検索したものが得られないと判断しました。 iOS6で向きの変更を処理する方法 について本当に良い答えがある質問にリダイレクトします

向きの変更に対する特定の要求: 制限された回転

賛成票は大歓迎です:)


マスター詳細テンプレートから新しいプロジェクトを作成し、横向きで開始しようとしています。ご存知のように

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

メソッドは非推奨であり、使用する必要があります

- (NSUInteger)supportedInterfaceOrientations

および/または

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

これが私のコードです:

- (NSUInteger)supportedInterfaceOrientations {
    NSLog(@"supported called");
    return UIInterfaceOrientationMaskAll;//Which is actually a default value
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    NSLog(@" preferred called");//This method is never called. WHY?
    return UIInterfaceOrientationLandscapeRight;
}

ご覧のとおり、私は好ましい方法で横向きを返そうとしていますが、呼び出されることはありません。 p.s.ドキュメントの状態:

考察システムは、View Controllerを全画面表示するときに、このメソッドを呼び出します。このメソッドは、View Controllerが2つ以上の方向をサポートしているが、コンテンツがそれらの方向の1つで最もよく表示される場合に実装します。

ビューコントローラがこのメソッドを実装している場合、表示されると、そのビューは優先方向で表示されます(ただし、後で別のサポートされている回転に回転できます)。このメソッドを実装しない場合、システムはステータスバーの現在の方向を使用してViewControllerを表示します。

したがって、問題は、prefferredOrientationメソッドが呼び出されないのはなぜですか?そして、さまざまなコントローラーでさまざまな方向をどのように処理する必要がありますか?ありがとう! P.Sは質問を重複としてマークしません。私はすべての同様の質問を調査しました、そして、彼らは私の答えを持っていません。

23
Stas

PreferredInterfaceOrientationForPresentationについて

preferredInterfaceOrientationForPresentationは、「提示された」ビューコントローラではないため、呼び出されることはありません。ここには「プレゼンテーション」は含まれていません。

「提示された」および「提示」は、「現れる」を意味する曖昧な用語ではありません。これらは正確な専門用語であり、このビューコントローラがpresentViewController:animated:completion:の呼び出しで機能することを意味します。つまり、このイベントは、これが「モーダル」ビューコントローラーと呼ばれていたものである場合にのみ到着します。

さて、あなたのビューコントローラーはnotモーダルビューコントローラーです。 notpresentViewController:animated:completion:で使用されます。したがって、「プレゼンテーション」は含まれません。したがって、ここではpreferredInterfaceOrientationForPresentationは関係ありません。

多くの人があなたと同じように混乱したり誤解したりするだろうと思っているので、私はこれについて非常に明確にしています。したがって、おそらくこのメモは彼らを助けるでしょう。

ランドスケープに入る

IOS 6では、Info.plistの「SupportedInterface Orientations」キーは、以前よりもはるかに真剣に受け止められています。目的の方向に起動するという全体的な問題の解決策は次のとおりです。

  1. Info.plistリストの「SupportedInterfaceOrientations」がallアプリが想定できる方向everであることを確認してください。

  2. 目的のlaunch方向が「サポートされているインターフェイスの方向」内のfirstであることを確認してください。

これですべてです。実際、初期方向を管理するためにルートビューコントローラーにコードを入力する必要はありません。

34
matt

ランドスケープモードでモーダルビューを起動する場合は、このコードを表示されたビューコントローラーに配置するだけです

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    UIInterfaceOrientation orient = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIInterfaceOrientationIsLandscape(orient)) {
        return orient;
    }

    return UIInterfaceOrientationLandscapeLeft;
}

次に、このコントローラーを通常どおりに提示します

UIViewController *vc = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[vc setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self.navigationController presentViewController:vc animated:YES completion:^{}];
8
FunkyKat

非常に簡単な答えがあります。モーダル表示ビューコントローラーのインターフェイスの向きのみを変更または修正できます。そうする場合、つまりInterfaceBuilderのPresentModally segue(またはナビゲーションコントローラーメソッド)を使用して、許可される方向を次のように定義できます。

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait; // for example else an addition of all allowed
}

このイベントは、ナビゲーションコントローラーでビューコントローラーを押すだけでは発生しません...したがって:戻るボタンがなく、

[self dismissViewControllerAnimated:YES completion: ^(void) {

    }];

それを閉じるために。

0
Tintenklecks