自定义segue类中的视图控制器获取方向太晚了

时间:2012-08-09 17:18:31

标签: ios uiviewcontroller orientation segue viewdidappear

我觉得我错过了一些明显的东西。

我有一个自定义的segue类。它做了一些动画。如果当前方向与笔尖的方向相同,它可以正常工作,但如果当前方向与笔尖不匹配(即当前方向是横向但是笔尖是纵向),则无法使其工作。

问题是目标视图控制器的框架和方向在viewDidAppear之前是错误的。但viewDidAppear为时已晚。任何在自定义segue中进行动画的尝试都必须在viewDidAppear之前进行。

奇怪的是,viewDidLoadviewWillAppear报告了正确的self.interfaceOrientation(虽然不幸报告了错误的框架),但任何尝试绘制这些方法的方法都会以错误的方向绘制。

有人想叫我白痴并指出我正在制造的明显错误吗?我将不胜感激。

1 个答案:

答案 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 +当前方向推断时,必须手动修改框架似乎是错误的。但这至少有效。