为了回答我自己的问题,我最终放弃了自定义 segue 并选择使用自定义容器控制器。这并没有解决视图控制器在出现之前不知道其正确框架的问题,但确实简化了问题。
我的问题的一个更直接的答案是容器控制器(或呈现控制器)有责任更改呈现控制器的框架。我发现,做到这一点的“最佳”方法是使用呈现/容器控制器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];
}];
}
这感觉并不理想,因为当可以从笔尖 + 当前方向推断时,必须手动修改框架似乎是错误的。但这至少有效。