私自身の質問に答えるために、私は最終的にカスタムセグエをあきらめ、カスタムコンテナコントローラーを使用することを選択しました。これは、ビューコントローラが表示されるまで適切なフレームを認識しないという問題を回避しませんが、問題を単純化しました。
私の質問に対するより直接的な答えは、提示されたコントローラーのフレームを変更するのはコンテナーコントローラー(または提示コントローラー)の責任であるということです。そして、それを行うための「最良の」方法は、提示/コンテナーコントローラー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];
}];
}
これは理想的とは言えません。ペン先+現在の向きから推測できる場合、フレームを手動で変更する必要があるのは間違っているように思われるからです。しかし、これは少なくとも機能します。