23

追加: 私の質問は賛成票なしで頻繁に表示されることがわかったので、検索結果が得られないと判断しました。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;
}

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

解説 システムは、View Controller を全画面表示するときにこのメソッドを呼び出します。ビュー コントローラーが 2 つ以上の方向をサポートしているが、コンテンツがそれらの方向のいずれかで最適に表示される場合に、このメソッドを実装します。

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

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

4

3 に答える 3

34

preferredInterfaceOrientationForPresentation について

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

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

さて、あなたのView ControllerはモーダルView Controllerではありません。とは関係ありませんpresentViewController:animated:completion:。したがって、「プレゼンテーション」は含まれないため、preferredInterfaceOrientationForPresentationここでは関係ありません。

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

ランドスケープへの起動

iOS 6 では、Info.plist の「Supported Interface Orientations」キーが以前よりも重要視されています。目的の方向に起動するという全体的な問題の解決策は次のとおりです。

  1. Info.plist の「Supported Interface Orientations」に、アプリが想定できるすべての向きがリストされていることを確認してください。

  2. 目的の起動方向が「サポートされているインターフェイスの方向」の最初にあることを確認してください。

それだけです。実際には、最初の向きを管理するためにコードをルート ビュー コントローラーに入れる必要はありません。

于 2012-10-15T14:06:27.210 に答える
8

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

- (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:^{}];
于 2013-02-13T13:24:19.690 に答える
0

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

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

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

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

    }];

閉じます。

于 2015-03-24T13:30:17.197 に答える