3

iOS 6 での自動回転の変更により、これが信じられないほど困難または不可能になったようです。彼らは、子View Controllerが親View Controllerの自動回転動作をオーバーライドする必要がないという哲学を推進しているようです。これにより、私がやろうとしていることを達成することが難しくなります:

  • 縦向きに表示する必要があるView Controllerがあります。
  • シンプルな画像ビューアである別のView Controllerをモーダルにプッシュしますが、このView Controllerを任意の縦向きまたは横向きに回転できるようにしたいです(明らかな理由により)
  • 子View Controllerが閉じられたとき(現在の向きに関係なく)、親View Controllerは縦向きのままでなければなりません

UIViewController クラス リファレンスからの関連する Apple ドキュメント

iOS 6 では、アプリは、アプリの Info.plist ファイルで定義されたインターフェイスの向きをサポートします。View Controller は supportedInterfaceOrientations メソッドをオーバーライドして、サポートされている向きのリストを制限できます。通常、システムは、ウィンドウのルート ビュー コントローラー、または画面全体に表示されるビュー コントローラーでのみ、このメソッドを呼び出します。子View Controllerは、親View Controllerによって提供されたウィンドウの一部を使用し、どの回転がサポートされているかに関する決定に直接参加しなくなりました。アプリの方向マスクとビュー コントローラーの方向マスクの交点は、ビュー コントローラーを回転できる方向を決定するために使用されます。

子View Controllerで回転をシミュレートするために変換を使用することを考えましたが、正直なところ、もっと良い方法があるはずだと感じており、可能であればそれを避けたいと思っています.

子View Controllerがインターフェイスの向きをサポートするには、その親View Controller(モーダルまたはその他の方法で提示される)もそのインターフェイスの向きをサポートする必要があるようです。

ここで簡単なものが欠けていますか?これは見た目ほどばかげていますか?

4

2 に答える 2

2

Navigation Controller をサブクラス化し、(NSUInteger)supportedInterfaceOrientationsメソッドをオーバーライドできます。そのため、Navigation Controller は、現在表示されている View Controller がサポートするものを常に返します。

以下のようなもの (コードとアイデアはテストされていません):

- (NSUInteger)supportedInterfaceOrientations {
    return [self.presentedViewController supportedInterfaceOrientations];
}
于 2012-10-06T01:35:28.040 に答える
2

私は今日同様の問題を扱っており、これにたどり着きました:

親ビューで、子が割り当てられているかどうかを確認します(したがって、私の場合は表示されます)。はいの場合、コードは任意の向きを許可し、そうでない場合は横向きのみを許可します。何かのようなもの:

で:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    bool result;

    if (self.photoViewController)
    {
        result = YES;
    }
    else
    {
        result = (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
    }

    return result;
}

- (NSUInteger)supportedInterfaceOrientations
{
    NSUInteger result;

    if (self.photoViewController)
    {
        result = UIInterfaceOrientationMaskAll;
    }
    else
    {
        result = UIInterfaceOrientationMaskLandscapeLeft+UIInterfaceOrientationMaskLandscapeRight;
    }

    return result;
}

childでは、この関数は少し異なって見えます:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

これにより、 Robotic Cat の回答へのコメントで言及したのと同じ問題が発生しました。

このコード ( Corey Floyd のスニペットのおかげで) は、親の向きを変えるように強制します。

UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:c animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];

子View Controllerが削除されるポイントの後に配置する必要があります。これは iOS 6.0 用に作成されたもので、元のリンクのコードを使用することもできます。

于 2012-10-09T00:47:03.417 に答える