自定义segue和导航控制器动画故障

时间:2014-07-19 04:36:24

标签: ios objective-c uinavigationcontroller uinavigationbar segue

我使用自定义segue,看起来像放大导航控制器。当segue完成并且调用方法pushViewController: animated:时,会出现毛刺效果。导航栏立即出现,并将下面的scrollView内容与其高度值(88像素)放在一起。下面的动画清楚地表示效果:
http://s7.postimg.org/7in5s980r/image.gif
正如您所看到的,scrollView的内容在segue的最后阶段移动得非常快 Animation glitch

以下是segue的代码:

- (void)perform {
    UIViewController *sourceViewController = self.sourceViewController;
    UIViewController *destinationViewController = self.destinationViewController;

    // Add the destination view as a subview, temporarily
    [sourceViewController.view addSubview:destinationViewController.view];

    // Transformation start scale
    destinationViewController.view.transform = CGAffineTransformMakeScale(0.05, 0.05);

    // Store original centre point of the destination view
    CGPoint originalCenter = destinationViewController.view.center;
    // Set center to start point of the button
    destinationViewController.view.center = self.originatingPoint;

    [UIView animateWithDuration:1.0
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{


                         destinationViewController.view.transform = CGAffineTransformMakeScale(1.0, 1.0);
                         destinationViewController.view.center = originalCenter;
                     }
                     completion:^(BOOL finished){

                         [destinationViewController.view removeFromSuperview];
                         [sourceViewController.navigationController pushViewController:destinationViewController animated:NO];

                     }];
}

我认为,问题是通常(如果它是推送segue)ViewController将内容放下一点(对于导航栏的高度)并在segue期间执行此操作。但现在,它将segue视为自定义并忽略导航栏(但显示它)并显示部分内容被NavBar重叠。当导航控制器呈现新VC时,它会计算NavBar的高度并立即放下内容。我想,在segue期间可能有办法设置scrollView的属性,如内容大小和起始点,但不知道如何实现它。

1 个答案:

答案 0 :(得分:1)

我现在没有XCode所以这是我的猜测。

所以,首先你做了

// Add the destination view as a subview, temporarily
[sourceViewController.view addSubview:destinationViewController.view];

然后,你打电话给

animateWithDuration:delay:options:animations:completion:

您看到的是哪种动画。如果我是对的,这会导致整个视图覆盖导航视图,因为您将此视图添加到顶部。

完成后,此视图将从superview中删除,但随后您将其推入导航视图控制器。此步骤将导致您在动画中看到的跳转。

这就是跳跃发生的原因:你的视图覆盖整个视图被删除(突然消失)。这样可以再次显示导航视图(导航栏显示),然后将视图推入导航视图控制器,它现在嵌入导航视图中。这就是为什么它看起来像动画故障并且移动速度非常快。