0

アプリで一部のビューを回転できるようにしようとしています(2つだけ)。これは、UINavigationcontrollerをサブクラス化し、対応するメソッドをオーバーライドする前に、これを正常に実行しました。今回の問題は、(プログラムではなく).xibファイルからナビゲーションコントローラーを作成するサードパーティのプロジェクトを使用していることです。カスタムナビゲーションコントローラーを使用するために.xibファイルのクラスを変更しましたが、何らかの理由で、shouldAutorotateやsupportedInterfaceOrientationsなどのオーバーライドメソッドを無視しています。

何か案は?

ありがとう

4

1 に答える 1

0

私はまだこれを処理するためのよりエレガントな方法を探していますが、私のために働いた小さなハックを共有します。もっと良いものを見つけたら、私に知らせてください。

複雑なナビゲーションツリーを備えたアプリでうまく機能したアプローチは、アプリにナビゲーションコントローラーがない場合は、最初のナビゲーションコントローラーまたは最初のビューコントローラーのカスタムサブクラスをインストールすることです。これは、shouldAutoRotate呼び出しを受信するものです。

すでにこれを行っているようです。

次に、shouldAutoRotateセクションに独自のロジックを挿入する必要があります。私が行ったことは、ビューコントローラが自動回転する必要がある場合に保存する場所としてappDelegateのBOOLを使用することです。基本的には次のように機能します。

appDelete:

@property (nonatomic,assign) BOOL allowAutoRotationForThisViewController;

スタックの先頭にあるカスタムナビゲーションコントローラー:

- (BOOL)shouldAutorotate {
     AppDelegate *a = [[UIApplication sharedApplication] delegate];
     return a.allowAutoRotationForThisViewController;
}

回転可能なビューコントローラー:

-(void) viewWillAppear:(BOOL)animated {
     [super viewWillAppear:animated];
     AppDelegate *a = [[UIApplication sharedApplication] delegate];
     a.allowAutoRotationForThisViewController = YES:

}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
     AppDelegate *a = [[UIApplication sharedApplication] delegate];
     a.allowAutoRotationForThisViewController = NO:
}

なぜ彼らがios6でこれを変更したのかはわかりませんが、特に複雑なナビゲーション構造を使用している場合は、はるかに難しいようです。スタックの一番上に「スライド」タイプのコントローラー、タブバーコントローラー、ナビゲーションコントローラーのスタックを備えたアプリがあります。それらすべてを選択して、スタックの下部にあるWebビューを回転させたり、トップレベルのコントローラーに応答させたりするのは非常に複雑です。だから私はこのアプローチを使用しました。

ここで、考慮しなければならないことの1つは、BOOLがNOになっている場合、回転は発生しないということです。したがって、回転中に回転可能なViewControllerが親に戻るかどうかが1つの落とし穴です。次に、親が回転し、回転可能なViewControllerが回転値をnoに戻します。私は、ポートレートモードでない限り、それが閉じないようにすることで、私のアプローチでこれを解決しました-基本的に、ランドスケープモードで「戻る」ボタンを無効にしました。

これは次のように機能します。-ビューが画面に表示されます-回転をYESに設定します-回転が発生します-この時点で、回転しているビューは次のセレクター呼び出しを受け取ります。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

したがって、その呼び出しの中で、ローカルビューを構成し、方向を変更するためにビューを設定するために必要なことをすべて実行します。たとえば、self.navigationController.hidesBackButton = YES;

それが役立つことを願っています、そして私が言ったように、それはちょっとしたハックであり、私はもっとエレガントなものを探しています。

幸運を祈ります

于 2013-03-15T00:31:50.460 に答える