1

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

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

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

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

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

4

1 回答 1

0

为了回答我自己的问题,我最终放弃了自定义 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];
  }];
}

这感觉并不理想,因为当可以从笔尖 + 当前方向推断时,必须手动修改框架似乎是错误的。但这至少有效。

于 2012-08-18T23:18:00.323 回答