2

セレクターを実行できるようにデバイスが回転されているかどうかを知るために、デバイスの向きの通知を使用しています。ここに私が使用しているコードがあります:

- (void)awakeFromNib
{
    isShowingLandscapeView = NO;
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(orientationChanged:)
                                                 name:UIDeviceOrientationDidChangeNotification
                                               object:nil];
}

- (void)orientationChanged:(NSNotification *)notification
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
        !isShowingLandscapeView)
    {
        [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
        [self performSegueWithIdentifier:@"landscape" sender:self];
        isShowingLandscapeView = YES;
    }
    else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&
             isShowingLandscapeView)
    {
        [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
        [self dismissViewControllerAnimated:YES completion:nil];
        isShowingLandscapeView = NO;
    }
}

ただし、他の子ビューに移動してデバイスを回転させると、セレクターが実行されますが、上記のコードは他のビューが持つクラスから独立したクラスにあります。どうすればそれを止めることができますか?私は試した:

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];

それもうまくいきませんでした。デバイスが回転すると、私のアプリは実際にランドスケープモードで別のビューにポップします。そのため、子ビューでは、デバイスを回転させると横向きのビューが表示されます。どうすればそれを修正できますか?

4

2 に答える 2

2

を削除するにはUIDeviceOrientationDidChangeNotification

[[NSNotificationCenter defaultCenter] removeObserver:self name: UIDeviceOrientationDidChangeNotification object:nil];

すべての通知を削除するには

[[NSNotificationCenter defaultCenter] removeObserver:self];
于 2013-03-22T22:58:49.510 に答える
0

親View Controllerで:

- (BOOL)shouldAutomaticallyForwardRotationMethods {
    return NO;
}

ドキュメントから:

このメソッドは、回転関連のコンテインメント コールバックを子ビュー コントローラーに自動的に転送するかどうかを決定するために呼び出されます。

デフォルトの実装は を返しますYES。包含ロジックを実装する UIViewController クラスのサブクラスは、このメソッドをオーバーライドして、これらのメソッドの転送方法を制御できます。このメソッドをオーバーライドして を返す場合NO、適切なタイミングで次のメソッドを子ビュー コントローラーに転送する必要があります。

willRotateToInterfaceOrientation:duration: willAnimateRotationToInterfaceOrientation:duration: didRotateFromInterfaceOrientation:

于 2013-03-22T22:59:05.723 に答える