0

本当に何週間もこれのために立ち往生しています。私はECSlidingViewControllerを使用していますが、1つのビューを横向きと縦向きに回転できるようにしたいのですが、それは風景写真であり、利用可能なスペースを利用する必要がありますが、アプリの残りの部分は回転させたくありません、ただ風景にとどまります。

この手法を使用してビューに切り替えるため、自動ローテーションメソッドは呼び出されないと確信しています...

- (void)setTopViewController:(UIViewController *)theTopViewController
{
  CGRect topViewFrame = _topViewController ? _topViewController.view.frame : self.view.bounds;

  [self removeTopViewSnapshot];
  [_topViewController.view removeFromSuperview];
  [_topViewController willMoveToParentViewController:_topViewController];
  [_topViewController removeFromParentViewController];

  _topViewController = theTopViewController;

  [self addChildViewController:self.topViewController];
  [self.topViewController didMoveToParentViewController:self];

  [_topViewController.view setAutoresizingMask:self.autoResizeToFillScreen];
  [_topViewController.view setFrame:topViewFrame];
  _topViewController.view.layer.shadowOffset = CGSizeZero;
  _topViewController.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.layer.bounds].CGPath;

    [self.view addSubview:_topViewController.view];
}

そして私のinitialviewcontrollerで...

self.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"Home"];

したがって、このビューに切り替えるのではなく、単に上にスタックしているだけです。したがって、常に初期ビューコントローラの回転方法をリッスンしています...

私が何日も立ち往生していると言ったので、助けは大歓迎です...

4

2 に答える 2

0

これは一般的な問題です。ビューコントローラをインスタンス化し、そのビューを別のビューコントローラのビューに追加するaddSubviewと、最初のコントローラは呼び出される自動回転に関連するものを取得しません。

このユースケースに対処するために、AppleはiOS5に「UIViewController封じ込め」と呼ばれるものを追加しました。この場合、子コントローラーを別のコントローラーに追加できます。次に、関連するすべてのメソッド(viewWillAppear/Disappear;自動ローテーションメソッドなどが子コントローラーに自動ルーティングされます)。

呼び出す必要のある重要なメソッドは次のとおりです。

addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:

詳細については、ContainerViewControllerの実装を参照してください。

ここでは、封じ込めの使用方法に関するステップバイステップの説明を提供するチュートリアルを見つけることができます。

これはiOS>5でのみ機能するため、iOS4をサポートする必要がある場合は、運が悪いことに注意してください。いずれの場合も、関連するメッセージをサブコントローラーに中継することで回避策を構築しようとする可能性があります。たとえば、私のアプリでは、これは次のようwillAnimateRotationToInterfaceOrientationになりdidRotateFromInterfaceOrientationます。

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
                                     duration:(NSTimeInterval)duration {

 [self.mainButtonBarController willAnimateRotationToInterfaceOrientation:interfaceOrientation
                                                               duration:duration];
 [self.boardController willAnimateRotationToInterfaceOrientation:interfaceOrientation
                                                               duration:duration];
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {

 [self.mainButtonBarController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
 [self.boardController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
}

つまり、同じメッセージを子コントローラーに転送するだけです。必要な他の方法(shouldAutorotate...など)についても同じことができます。

于 2013-01-09T18:50:01.437 に答える