0

shouldAutorotateToInterfaceOrientationを呼び出すときに回転しないUIVIewを作成したいのですが、他のサブビューは回転します。

そして、shouldAutorotateToInterfaceOrientationサポートを維持し、通知を使用しないようにします。

ありがとう

4

2 に答える 2

3

デバイスが回転したときにビューを「回転させない」ようにして、意味を正確に定義してください。回転は、参照する座標系に応じて、いくつかの意味を持ちます。それについて考えるより良い方法は、単純に、デバイスの向きごとにビューをどのように見せたいかということです。

念のために言っておきますが、shouldAutorotateTo...はシステムによってViewControllerに送信されます。自分で呼び出すことはありません。回転は発生しません。これにより、システムはViewControllerにサポートする方向を尋ねることができます。

VCは、サポートするすべての方向について「はい」と答える必要があります。サポートされている向きとは、デバイスの向きの変更に応じてビューがレイアウトを変更する向きです。したがって、特定の向きでレイアウトの変更が発生した場合、shouldAutorotateToの答えはおそらくYESです。

特定のインターフェイスの向きに合わせてサブビューのレイアウトを変更するのは、ほとんどの場合ユーザーの責任です。ビューにはautoresizingMaskがあります。これは、親を基準にしてサイズ設定と配置を行うためのいくつかのオプションを記述するビットベクトルであり、多くの場合、これで十分です。向きの変更時にレイアウトを完全に制御する方法は、willAnimateRotationToInterfaceOrientationを実装することです。

たとえば、これはかなり寛容なshouldAutorotateで、1つを除くすべての方向を有効にします...

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

そして、回転時にサブビューがどのようにレイアウトされるかを制御する方法は次のとおりです...

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    UIView *testView = [self.view viewWithTag:16];

    if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {
        // change frames here to make the ui appear according to your spec
        // including however you define "not rotating" for each view
        self.subviewA.frame = .....
        self.subviewB.frame = .....                
    } else {
        self.subviewA.frame = .....
        self.subviewB.frame = .....
    }
}
于 2012-07-08T16:55:48.797 に答える
0

1つのUIViewを向きを変えて回転させたくない場合、簡単な解決策の1つは、そのビューをこのようにアプリケーションのトップウィンドウに追加することです。ウィンドウはデバイスの向きで回転しないためです。

[[[[UIApplication sharedApplication]windows]objectAtIndex:0]addSubview:customView];
于 2012-07-09T11:36:57.780 に答える