我觉得我错过了一些明显的东西。
我有一个自定义的segue类。它做了一些动画。如果当前方向与笔尖的方向相同,它可以正常工作,但如果当前方向与笔尖不匹配(即当前方向是横向但是笔尖是纵向),则无法使其工作。
问题是目标视图控制器的框架和方向在viewDidAppear
之前是错误的。但viewDidAppear
为时已晚。任何在自定义segue中进行动画的尝试都必须在viewDidAppear
之前进行。
奇怪的是,viewDidLoad
和viewWillAppear
报告了正确的self.interfaceOrientation
(虽然不幸报告了错误的框架),但任何尝试绘制这些方法的方法都会以错误的方向绘制。
有人想叫我白痴并指出我正在制造的明显错误吗?我将不胜感激。
答案 0 :(得分:0)
为了回答我自己的问题,我最终放弃了自定义segues并选择使用自定义容器控制器。这不会解决视图控制器在出现之前不知道其正确框架的问题,但确实简化了问题。
我的问题更直接的答案是容器控制器(或呈现控制器)负责更改所呈现的控制器的框架。我发现,做到这一点的“最佳”方法是使用呈现/容器控制器的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];
}];
}
这不太理想,因为当从nib +当前方向推断时,必须手动修改框架似乎是错误的。但这至少有效。