【发布时间】:2012-05-15 03:35:06
【问题描述】:
按照 Apple 的建议,我通过将后续对 -animationWithDuration:animation: 的调用放在对 aanimateWithDuration:animation:completion: 的另一个调用的 completion: 块中来链接 UIView 动画,如下所示:
[UIView animateWithDuration:scaleDuration delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
// Scale the controllers' views down.
self.view.transform = CGAffineTransformScale(self.view.transform, 0.8, 0.8);
} completion:^(BOOL finished) {
// Transition to the new view and push on the new view controller.
[UIView transitionWithView:self.view duration:1 options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionTransitionFlipFromLeft animations:^{
[self pushViewController:viewController animated:NO];
} completion:^(BOOL finished) {
[UIView animateWithDuration:scaleDuration delay:0 options:UIViewAnimationOptionCurveLinear animations:
^{
// Scale back to the original size.
self.view.transform = CGAffineTransformScale(self.view.transform, 1.25, 1.25);
} completion:nil];
}];
}];
动画都执行正确的顺序,但它们之间有一个微小的延迟,尤其是在-transitionWithView:duration:options:animations:completion: 调用之前。如何平滑动画步骤之间的过渡?
【问题讨论】:
-
在这种情况下
self是一个导航控制器,因为您将pushViewController:发送给它?什么是预期的动画,在视图之间“翻转”而不是像普通导航控制器那样向左/向右滑动? -
好的。被推送的视图控制器是否实现
loadView、viewDidLoad、viewWillAppear或viewWillLayoutSubviews?如果是这样,请检查它们是否在动画期间被调用,并确保它们不做任何需要时间的事情。 -
抱歉,@MattiasWadman 的回复延迟了,我上周都在参加会议。是的,它在
viewWillAppear中加载了一个AQGridView,它又加载了一个NSFetchedResultsController 和一堆带有从磁盘加载的图像的视图。这显然可能会产生一些开销。我想知道我是否可以在动画开始之前让它做到这一点…… -
好的。是的,这些图像听起来是一个很好的起点。首先尝试跳过加载它们检查您是否看到和差异。也许您可以以某种方式预加载图像?有点丑陋的解决方案是让视图控制器在其
init中加载它,然后在使用它等创建视图时将其作为参数传递。 -
感谢您回来查看,@MattiasWadman。如果我减少在
gridView:cellForItemAtIndex:中完成的工作,它肯定会减少时间,尤其是在我删除图像加载的情况下。仍然有轻微的停顿,但大大减少了。我只需要弄清楚如何在动画开始之前加载这些东西。
标签: cocoa-touch uiview uinavigationcontroller core-animation uiviewanimationtransition