0

そのため、現在、私の iPhone アプリケーションには、画面全体に表示される tabviewcontroller があります。アプリは縦向きモードでのみ実行されます。私の仕事は、デバイスの向きの変化を検出し、横向きに変わったら、新しい uiview を画面全体に表示することでした。

デバイスの向きの変化の検出が既に機能しています。方向の変化が検出されたら、NSNotificationCenter を使用してヘルパー メソッド deviceOrientationChanged を正常に呼び出しました。変更がランドスケープ モードだった場合は、特定のコード ブロックを実行します。

このコード ブロックでは、既にさまざまなことを試しましたが、どれも成功していません。簡単に言えば、self.view = newViewThing; ステータスバーが上部にあり、タブが下部にあるため、機能しません。また、この newViewThing をサブビューとして UIWindow に追加しようとしました。ビューが追加されたときに向きが正しくなかったため、これは機能しませんでした。

質問は: デバイスの向きの変化が検出されたら、まったく新しい uiview をロードする方法はありますか? 前もって感謝します。

4

1 に答える 1

1

はい、新しいビューをロードする方法があります。私は自分のアプリでそのようにします:

- (void)orientationChanged:(NSNotification *)notification
{
    // We must add a delay here, otherwise we'll swap in the new view
    // too quickly and we'll get an animation glitch
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}

- (void)updateLandscapeView
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && !isShowingLandscapeView)
    {
        [self presentModalViewController:self.landscapeView animated:YES];
        isShowingLandscapeView = YES;
    }
    else if (deviceOrientation == UIDeviceOrientationPortrait && isShowingLandscapeView)
    {
        [self dismissModalViewControllerAnimated:YES];
        isShowingLandscapeView = NO;
    }    
}

また、このコードを次の場所に追加しましたviewDidLoad:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:)
                                             name:UIDeviceOrientationDidChangeNotification object:nil];

このコードをdealloc次のようにします。

[[NSNotificationCenter defaultCenter] removeObserver:self];
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
于 2012-06-13T06:27:40.007 に答える