1

明らかな何かが欠けているような気がします。

カスタムセグエクラスがあります。それはいくつかのアニメーションを行います。現在の向きがペン先の向きと同じであれば問題なく動作しますが、現在の向きがペン先と一致しない場合(つまり、現在の向きは横向きですが、ペン先は縦向き)は機能しません。

問題は、デスティネーションビューコントローラのフレームと向きが。まで間違っていることviewDidAppearです。しかしviewDidAppear、手遅れです。カスタムセグエ内でアニメーションを実行しようとすると、の前に実行する必要がありviewDidAppearます。

奇妙なことに、正しいものviewDidLoadを報告します(残念ながら、間違ったフレームを報告します)が、これらの方法で描画しようとすると、間違った方向に描画されます。viewWillAppearself.interfaceOrientation

誰かが私をばかと呼んで、私が犯している明らかな間違いを指摘したいですか?よろしくお願いします。

4

1 に答える 1

0

私自身の質問に答えるために、私は最終的にカスタムセグエをあきらめ、カスタムコンテナコントローラーを使用することを選択しました。これは、ビューコントローラが表示されるまで適切なフレームを認識しないという問題を回避しませんが、問題を単純化しました。

私の質問に対するより直接的な答えは、提示されたコントローラーのフレームを変更するのはコンテナーコントローラー(または提示コントローラー)の責任であるということです。そして、それを行うための「最良の」方法は、提示/コンテナーコントローラーboundsを開始点として使用することです。提示/コンテナframeは、向きの変化を正確に反映しません。

コードの例として、私のカスタムコンテナコントローラーから:

- (void)slideToEdit {

  // add edit to container and prep home for removal from container
  [self.home willMoveToParentViewController:nil];
  [self addChildViewController:self.edit];

  // the vital frame setting <- this is the bit that solves the problem
  self.edit.view.frame = self.view.bounds;

  // prep the animation
  __block CGRect frame = self.edit.view.frame;
  frame.origin.x += frame.size.width;
  self.edit.view.frame = frame;

  // animate
  [self transitionFromViewController:self.home toViewController:self.edit
    duration:SLIDE_SPEED options:UIViewAnimationCurveLinear animations:^{

    // slide animation
    frame.origin.x -= frame.size.width;
    self.edit.view.frame = frame;

  } completion:^(BOOL done) {
    [self.home.view removeFromSuperview];

    // finalise container heirarchy
    [self.home removeFromParentViewController];
    [self.edit didMoveToParentViewController:self];
  }];
}

これは理想的とは言えません。ペン先+現在の向きから推測できる場合、フレームを手動で変更する必要があるのは間違っているように思われるからです。しかし、これは少なくとも機能します。

于 2012-08-18T23:18:00.323 に答える