2

私がやろうとしているのは、最も単純な概念です。しかし、私は望ましい結果を得ていません。

私のアプリは標準のタブ バー アプリです。各タブのすべてのビュー コントローラーは縦向きのみをサポートしています。これはまさに私が望んでいるものです。

ただし、アプリの 1 つのセクションで、明らかにタブ バー コントローラーをカバーするモーダル ビュー コントローラーを表示します。これはテキスト入力画面であり、このビューが縦向きだけでなく横向きもサポートできるようにしてほしいと思います。次に、ユーザーがそのモーダル ビュー コントローラーをキャンセルすると、タブ バー コントローラーが再び表示され、すべてが縦向きになります。

私は非常に多くのことを試しましたが、何も機能しません。アプリに両方の向きをサポートするように指示すると、回転はモーダルで正しく発生しますが、アプリの残りの部分でも発生しますが、これは望ましくありません。

新しい shouldAutorotate メソッドと supportInterfaceOrientations メソッドをすべて実装しようとしましたが、何も機能していないようです。

ほとんどの作業に最も近い試みは、アプリのデリゲートに UITabBarController カテゴリを作成して、shouldAutorotate と supportedInterfaceOrientations を転送することでした。これは最初は機能しているように見えましたが、何らかの理由で、モーダル VC をキャンセルするたびに、アプリのタブ バー部分が常にステータス バーの後ろに 20 ピクセル上に移動していました。私はそれが何であるか分かりません。

UITabBarController が存在しないテスト アプリを作成しましたが、目的の動作を問題なくコーディングでき、完全に動作しました。明らかに、Tab Bar Controller に関する何かがこれを困難な問題にしています。

この単純な概念を解くコツを教えてください。

ありがとう!

4

2 に答える 2

3

UITabBarController と UINavigationController のいくつかのカテゴリを作成することで、これを解決できました。使用したコードは次のとおりです。

@implementation UITabBarController (rotations)

- (BOOL)shouldAutorotate
{
    return [self.selectedViewController shouldAutorotate];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
}

- (NSUInteger)supportedInterfaceOrientations
{
    return [self.selectedViewController supportedInterfaceOrientations];
}

@end

@implementation UINavigationController (navrotations)

- (BOOL)shouldAutorotate {

    return [self.topViewController shouldAutorotate];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return [self.topViewController shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
}

- (NSUInteger)supportedInterfaceOrientations
{
    return [self.topViewController supportedInterfaceOrientations];
}

@end

次に、もちろん、表示する各ビュー コントローラーは、shouldAutorotate および supportedInterfaceOrientations メソッドに応答する必要があります。

于 2012-12-07T20:32:29.320 に答える
2

どうやらios6以降では回転の仕方が違うようです。だからあなたがしなければならないことは次のとおりです

  1. .plist では、4 つの方向すべてをサポートします。
  2. UITabBarController をサブクラス化します (例: CustomTabBarController)
  3. CustomTabBarController に、次のコード行を入れます

    -(NSUInteger)supportedInterfaceOrientations
    {
        return UIInterfaceOrientationMaskPortrait;
    }
    
    
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
        return UIInterfaceOrientationPortrait;
    }
    
  4. アプリのデリゲートまたは UITabBarController を初期化している場所で、これらのインスタンスを CustomTabBarController インスタンスに置き換えます。

  5. モーダルコントローラーに次の行を入れます

    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
     {
        return UIInterfaceOrientationLandscapeLeft;
    }
    
    -(BOOL)shouldAutorotate{
        return NO;
    
    }
    

そして、それはすべてうまくいくはずです。

どうやら、私が見つけたトリックは、 UITabBarController があなたの指示を聞かないということです。.plist で言及したすべての方向をサポートします。

そのため、サブクラス化する必要があります。

上記のすべてを実行してみましたが、正常に動作します。お知らせいただければ、必要に応じてコードをお送りします。

于 2012-12-07T18:54:30.197 に答える