2

これは多くの人を悩ませてきたものであることがわかります:/

UINavigationControllerタイプの4つのviewControllerを持つUITabBarControllerがあります。NavigationControllerの1つがviewControllerをスタックにプッシュします。このviewControllerは横向きモード/向きで表示する必要があります。

viewControllerはグラフであり、横向きが理にかなっているアプリ内で絶対に唯一の場所です。(これが表示されたときにUITabBarを非表示にして、これがどこでも機能するとユーザーに思わせないようにします)

UITabBarControllerが方向の変更に正しく応答するようにするには、そのすべてのviewControllerがデリゲートメソッドから同じ値を返す必要があります。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

したがって、この動作に対応するために、UITabBarControllerに属するすべてのviewControllerにこのメソッドを実装しました。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    BOOL canRotate = [defaults boolForKey:@"can_rotate"];

    return canRotate;
}

「トリック」とは、ランドスケープになり得るviewControllerがプッシュされたときに、次のことを行うことです。

- (void) viewWillAppear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:YES forKey:@"can_rotate"];
    [defaults synchronize];

}

そしてそれがポップされたとき、私はこれを行います:

- (void) viewWillDisappear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:NO forKey:@"can_rotate"];
    [defaults synchronize];

}

これは本当にうまくいきます。viewControllerがスタック上にある場合、デバイスを回転させることができ、ビューが続きます。

ただし、問題は、ユーザーが横向きモードでナビゲーションバーの「戻る」ボタンをタップして、viewControllerを前のviewControllerにポップした場合、この「古い」viewControllerももちろん横向きモードになることです。さらに悪いことに、BOOLをNOに設定したため、デバイスを縦向きモードにすると、この「古い」viewControllerは回転して戻ることができません。

横向きモードのviewControllerをポップしたときに、他のviewControllerが横向きモードにならないようにすべてを更新する方法はありますか?

これが横向きから横向きにできるのであれば、縦向きから横向きにもできるはずなので、私の「ハック」は不要になるのではないかと少し心配しています。しかし、それができない場合は、正方形に戻ります:/

私が近くにいて、誰かが私がそこに着くのを手伝ってくれることを願っています、ありがとう:)

4

1 に答える 1

1

全体を単純化できると思います。

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
return NO;
}

-(void) viewDidAppear:(BOOL)animated { [UIView beginAnimations:@"View Flip" context:nil]; [UIView setAnimationDuration:0.5f]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(90.0*0.0174532925);
    self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
    self.view.center = CGPointMake(160.0f, 240.0f);

// [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight;

[UIView commitAnimations];
[super viewDidAppear:animated];

}

自動回転するものはありませんが、移動するビューを手動で回転します。ビューでキーボードのサポートが必要ない場合は、statusBarOrientationを変更する必要はありません。

そのビューを常に回転させたくない場合は、少し難しい問題があります-加速度計の値をチェックして、電話がどちらの方向を向いているかを確認することをお勧めします(または、電話がどちらの方向に回転したかを示すことができる場合がありますshouldAutotateToInterfaceOrientationを呼び出してから、必要に応じて変換コードを呼び出します。

于 2010-06-09T21:59:02.493 に答える