2012-08-09 71 views
1

我觉得我错过了明显的东西。自定义Segue类中的视图控制器获取方向太迟

我有一个自定义的segue类。它做了一些动画。如果当前方向与笔尖方向相同,则工作得很好,但如果当前方向与笔尖不匹配(即当前方向是风景但笔尖是肖像),则无法使其工作。

问题是目标视图控制器的框架和方向是错误的,直到viewDidAppear。但viewDidAppear为时已晚。任何尝试在自定义细节内执行动画必须在viewDidAppear之前发生。

奇怪的是,viewDidLoadviewWillAppear报告正确self.interfaceOrientation(而不幸的是报告错误的帧),但任何试图在这些方法绘制将在错误的方向画。

任何人都想叫我一个白痴,并指出我正在犯的明显错误?我将不胜感激。

回答

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]; 
    }]; 
} 

这并不觉得最理想的,它无需手动修改的框架似乎是错误的,当它可能从笔尖+电流推断方向。但这至少起作用。