1

私は今本当に混乱しています。私はこれを行うリンゴのサンプルコードを使用しました:

  1. ポートレートビューコントローラーとランドスケープビューコントローラーを作成します
  2. 次に、Potraitイベントコントローラーは、デバイスの向きが変更された通知を登録します
  3. デバイスを回転させると、ランドスケープビュー用のモーダルビューコントローラが表示されます。ポートレートに戻すと、ランドスケープビューが表示されなくなります。
    少しの問題を除いて、すべてが正常に機能しています...。

今私の問題に。これを使用して、テーブルビューから回転可能なビューコントローラを起動しました。回転させることができ、正常に動作します。ただし、最初に横向きモードで起動した場合でも、縦向きで起動します。横向きにしたい場合は、後でもう一度横向きに回転させる必要があります。これを修正するために非常に懸命に努力しましたが、失敗しました。こちらのAppleDeveloperSiteからサンプルコードをダウンロードして実行できます。ランドスケープモードで起動した場合にランドスケープビューのモーダルビューが表示されるように、このコードを修正できますか?それ以外の場合は、単一のViewControllerを使用するためにすべてを書き直す必要があります。これらはリンゴのコードの関連部分です:

- (void)viewDidLoad
{
self.view.backgroundColor = [UIColor colorWithRed:197.0/255.0 green:204.0/255.0 blue:211.0/255.0 alpha:1.0];

LandscapeViewController *viewController = [[LandscapeViewController alloc]
                                                initWithNibName:@"LandscapeView" bundle:nil];
self.landscapeViewController = viewController;
[viewController release];

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

}

- (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.landscapeViewController animated:YES];
    isShowingLandscapeView = YES;
}
else if (deviceOrientation == UIDeviceOrientationPortrait && isShowingLandscapeView)
{
    [self dismissModalViewControllerAnimated:YES];
    isShowingLandscapeView = NO;
}    
}

// override to allow orientations other than the default portrait orientation
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{return (interfaceOrientation == UIInterfaceOrientationPortrait); // support only portrait}
4

2 に答える 2

1

これはおそらくあなたにはもはや関係がないことを私は知っていますが、私はちょうど同じグリッチに遭遇しました、そしてこれが私の解決策です。

コードを設定する方法から(Appleがコードを設定する方法を含む)

- (void)updateLandscapeView

は、ViewControllerに方向の変更を通知する通知が送信されたときにのみ呼び出されます。ここでの問題は、これが方向を自分でチェックするためのメソッドであるということです。(つまり、アプリケーションを起動すると、このメソッドは呼び出されないため、デバイスが他の方向にあるかどうかはチェックされません)

解決策は非常に簡単です。起動時、つまりviewDidLoadでメソッドを強制的に計算します。。。

[self  updateLandscapeView]

これにより、メソッドが強制的に呼び出され、インターフェイスの向きが確認されます。最初の時間以降は、向きが変更されたという通知を受け取るたびに、メソッドが再度呼び出されます。

これが誰かを助けてくれることを願っています

于 2013-09-03T15:48:55.957 に答える
0

設定で横向きのみを指定しない限り、デバイスは縦向きを想定しているようです。唯一のオプションは、loadviewメソッドのポートレートビューで、方向を検出し、起動中にビューを交換することです。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
        {
           if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown ) {
        //Load vertical interface
           }
    else
    {
    //load landscape
    }
        }
于 2012-09-28T01:02:01.983 に答える