5

ご挨拶!これがシナリオです。

ナビゲーション コントローラーから始めて (タブ バーは存在しません。以前のビュー コントローラーのプッシュでは非表示になっています)、新しいビュー コントローラーを初期化し、ナビゲーション コントローラー スタックにプッシュします。この新しい VC には、同じフレームを持つ UIScrollView をプログラムで追加する孤独なUIViewが含まれています。( UIViewを避けたかったのですが、これがself.viewを何かに割り当てる唯一の方法でした。 viewDidLoadでUIScrollViewUIViewにキャストすることはお勧めできません。)

これで、ナビゲーション バーとスクロール ビューができました。いくつかの画像をスクロールするように設定しました (大きな驚きです!)、それは問題なく動作します。これでオートローテーションをサポートしたいと思います。したがって、私は VC で次のように応答します。

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

コンパイルして実行します。ああ、そして...何もない。明らかに、私は何か悪いことをしました。

今、私はすでにUINavigationController と autorotationに関する投稿を読んでおり、これについて間違った方法で行っており、必要以上に複雑にしているというこっそりの疑いがあります。

自動回転をサポートするUIScrollViewを表示するには、もっと良い方法が必要です。ナビコントローラーが邪魔なのかもしれませんが、どうやって回避すればいいのかわかりません。

理想的には、ナビゲーション バーが一切表示されないものが欲しいです。代わりに、上部に表示/非表示になるツールバー/ステータス バーがあります (ビデオの再生時に表示されるように)。ナビゲーション バーをそのままにしておく必要がある場合、またはそれが本当に高さの低いナビゲーション バーである場合、ビデオとツールバーを再生するときに表示されますが、回転させることはできますか? 問題は、ピックスを表示するときに、この特定のモードでのみ回転させたいということです。他の時ではありません。

あえてモーダル VC を使用してみますか? (ええ、いや、それも正しくありません。さらに、とにかくナビゲーションバーがあります。)

4

3 に答える 3

13

UITabBarController カテゴリを作成することで、サブクラス化せずにこれを解決できます。

以下は、タブに関連付けられた匿名の UINavigationControllers と、UINavigationControllers のルート ビュー コントローラーとしてのカスタム UIViewController サブクラスがある場合を処理するカテゴリの実装です。

@implementation UITabBarController (Rotation)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{   
    if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) {
        UIViewController *rootController = [((UINavigationController *)self.selectedViewController).viewControllers objectAtIndex:0];
        return [rootController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    }
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

UINavigationController には、デフォルトで YES を返すカテゴリもあります。したがって、デフォルトの動作は回転を有効にすることであり、回転を無効にしたいコントローラーと向きだけに対して shouldAutorotateToInterfaceOrientation:interfaceOrientation から NO を返すことができます。

于 2011-02-10T05:25:21.607 に答える
5

はい、思ったより簡単でした!

確かに、タブ バーは表示されませんが、これは基本的にタブ バー ベースのアプリです。

UITabBarControllerが自動回転を許可しない限り、他のビューではすべての賭けがオフになります。つまり、UITabBarControllerをサブクラス化し、適切に応答するだけですshouldAutorotateToInterfaceOrientation:(Xcode がデフォルトで行うように App Delegate の一部にするのではなく)。

どうやってそれをしますか?よろしくお願いします。以下の手順は、Xcode の既定値を使用してタブ バー コントローラー アプリを作成した場合にのみ実行してください。(これを試す前に作業をバックアップしてください! 免責事項 免責事項、ヤッダヤッダ。)

  1. 新しいUIViewControllerサブクラスを作成します (VC と呼びます)。の明示的なデリゲートを持つUITabBarControllerのサブクラスになるように調整しますUITabBarControllerDelegate
  2. アプリ デリゲートからのすべてのタブ バー デリゲート ビットをこの新しい VC に移植します。
  3. 新しい VC のviewDidLoadメソッドでself.delegate = self;、最後に追加します。
  4. MainWindow.xib (またはタブ バー コントローラーとタブ バーが定義されている場所) で、Tab Bar Controller オブジェクトを選択し、Identity Inspector ( Cmd -4 ) に移動します。クラスを標準のUITabBarControllerクラスではなく、新しい VC に変更します。

今、私たちはビジネスをしています。これを新しいVCソースに追加するだけです:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES; // Adjust to taste
}

なぜデリゲートのものですか?IB ファイルの所有者はUIApplicationであり、デリゲートを IB 経由で新しい VC に結び付けることができませんでした。デリゲート メソッドに応答する機会が必要なので、明示的に追加しました。それが必要ない場合は、省略しても問題ありません。(これが IB で実行できる場合は、誰かが参加してください!)

残っている唯一のトリックは、これをYES selectedに設定することです。常に自動回転をサポートしたくない場合があります(私の場合のように)。これが私のやり方です。最初に、新しく追加されたメソッド (上から) を次のように変更します。

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

これで、アプリの任意の VC からこの同じメソッドに応答できるようになり、Tab Bar コントローラーにバブルアップします! たとえば、私のアプリでは、ポートレートでのみ表示したい VC があるので、次のように応答します。

return (interfaceOrientation == UIInterfaceOrientationPortrait);

ただし、この同じ VC は、ユーザーをフォト ギャラリーに移動させることができます。その VC の autorotate メソッドでは、私は別の方法で応答します。

return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

これで、ギャラリー ビューで、上下逆さまの縦向きを除くすべての向きに自動回転できるようになりました。また、ビュー コントローラー チェーンに戻ると、向きが縦向きに戻ります。:)

于 2009-07-29T12:32:59.780 に答える
1

それはさらに簡単です:

1)説明したように...をサブクラスUITabBarController化して実装しshouldAutorotateます(2番目のコードスニペット)

2) を変更xxxAppDelegate.hして、UITabBarController作成したばかりのサブクラスに変更されたクラスを作成します。(#import YourNewTabBarController.h を使用)

3)MainWindow.xibタブ バー コントローラーのクラスを新しいクラスに変更します。

プレスト!

PS: ...YourNewTabBarControllerのみを実装する必要がありshouldAutoRotateます。他のすべての (自動生成された) ものを削除します。

于 2010-08-11T17:57:23.267 に答える