1

私はiOS5に取り組んでおり、ストーリーボード、セグエ、さまざまな向きのビューの調整に苦労しています。過去数日間Appleの助けを借りた後、私は自分の答えの場所を1つ見つけられませんでした。私は非常に注意深く明確に表現するという次の結論に達しました。私が正しいかどうか、誰かが教えてくれることを願っています。

1-ストーリーボードを使用することは、セグエを使用する必要があることを意味しません(はい、これは初心者にとって混乱です)。

2-ナビゲーションコントローラーに属するVC間でのみセグエを使用できます。

3-一方、ナビゲーションコントローラーがあるからといって、あるVCから別のVCにセグエを使用する必要があるとは限りません(そうです!)。したがって、あるVCから別のVCに移動しようとしている場合(最初のVCがNav Controllerに属しているかどうかに関係なく)、次のことができます。

WhiteVCクラスとYellowVCクラスがあり、(ストーリーボード内の)WhiteVCビューにボタンを配置し、それをWhiteVCクラスのIBActionにリンクしたとします。これは、WhiteVC.mで実装するコードであり、そのボタンをクリックして、YellowVCビューを表示できるようにします。

-(IBAction)GoToYellow 
{
  YellowViewController *YellowVC=[self.storyboard instantiateViewControllerWithIdentifier:@"myYellowVC"];                                             
  [self presentViewController:YellowVC animated:YES completion:nil];
}

YellowVCからWhiteVCに戻るには、YellowVCビューに別のボタンを作成し(上記と同じプロセスに従います)、次のコードを使用します。

-(IBAction)ReturnToWhiteVC 
{
  [self dismissViewControllerAnimated:YES completion:nil];
} 

これにより、YellowVCが閉じられ、WhiteVCに戻ります。

4- 1つのVCが複数のビューを所有する(インスタンス化する)ことはお勧めしません(たとえば、方向が異なる場合)。ビューごとに個別のVCを使用することをお勧めします。ただし、VCがMVCの一部として他のVCをインスタンス化することは問題ありません。

5-これはすべて、Nav Controllerを備えたアプリを作成していたために発生しましたが、そのルートVCは、横向きか縦向きかによって異なります(異なるビューを持つ異なるVC)。したがって、VCをプログラムでインスタンス化することもできます(上記の#3のように)。これはうまく機能しました。または、セグエを使用して移行を実行したい場合は、アップルのヘルプドキュメントに次のコードが用意されています。

BOOL isShowingLandscapeView;
- (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)
  {
    [self performSegueWithIdentifier:@"AlternateView" sender:self];  
    isShowingLandscapeView = YES;
  }

  else if (UIDeviceOrientationIsPortrait(deviceOrientation) && isShowingLandscapeView)
  {
    [self dismissViewControllerAnimated:YES completion:nil];// breakpoint shows that this is triggered
    isShowingLandscapeView = NO;
  }
 }

上記のコードは明らかにNavController(セグエのため)にのみ適用され、向きが縦向きから横向きに変わったときに機能しましたが、縦向きに回転すると、横向きVCが縦向きに回転してしまいます。私はここで何を間違っているのですか?

誰かがこれらの点を検証/確認し、私の質問に答えてくれることを願っています。KBに感謝します。

4

1 に答える 1

1

まず第一に、セグエは a だけでは適用されずUINavigationController、任意UIViewControllerでセグエを実行できます。

Apple のドキュメントには、向きを処理するために使用するそれぞれのサポートされている向きを制限する必要があるとも書かれています。UIViewControllerつまり、縦向きを縦向きのみ、横向きを横向きのみに制限する必要があります)。これは、ドキュメントに従って実行できます。

次に、向きを管理するために Apple のデザインを使用するために、Alex Moffat によるこのブログ投稿に従うことができます。

基本的に、同じコンテンツを表示する 2 つのビュー コントローラー (横向き用と縦向き用) を使用してビュー階層を設計し、ナビゲーション コントローラーに埋め込む方法について説明します。両方のビュー コントローラーは、自動回転できる 3 つ目のビュー コントローラーをプッシュできる必要があります。

主なアイデアは、Landscape ビューをナビゲーション スタックにプッシュ/ポップし、それに応じて 3 番目のビューで遷移を処理することです。

そのコードを独自のビュー階層に適合させることができるはずです。

于 2013-01-15T13:13:45.017 に答える