1

我想对一些 CALayers 的位置进行动画处理。在动画结束之前,我想推另一个UIViewController,这样当我弹出最后一个 UIView 控制器时,CALayers它们会回到原来的位置。这是我的代码:

CABasicAnimation *animation4 = [CABasicAnimation animationWithKeyPath:@"position"];
animation4.fromValue = [control.layer valueForKey:@"position"];

CGPoint endPoint4=CGPointMake(512, -305);

animation4.toValue =[NSValue valueWithCGPoint:endPoint4];
animation4.duration=1;
[control.layer addAnimation:animation4 forKey:@"position"];

[self performSelector:@selector(goToSolutionViewController) withObject:nil afterDelay:0.9];

goToSolutionViewController我有:

-(void)goToSolutionViewController{

    SolutionViewController *solution=[self.storyboard instantiateViewControllerWithIdentifier:@"SolutionViewID"];

    [self.navigationController pushViewController:solution animated:NO];

}

问题是

[self performSelector:@selector(goToSolutionViewController) withObject:nil afterDelay:0.9]

直到动画结束才被调用。所以goToSolutionViewController在 1.9 秒而不是 0.9 秒后调用。

在动画结束之前我能做些什么来推送 UIViewController?或者CALayers当我弹出时让背部处于原始位置UIViewController但用户看不到返回的方式。

编辑: - -

此性能问题仅在我第一次执行动画并推送 UIViewcontroller 时发生。当我弹出它并再次执行所有操作时,性能就像幽灵一样。问题可能与第一次 UIViewController 加载时间有关。

4

1 回答 1

1

与延迟后执行相比,您应该使用动画回调之一来调用您的方法,而不是依赖动画的时间。您可以使用允许您使用块的 CATransaction,也可以使用普通的委托方法。

使用 CATransaction

通过在事务中包装动画(将其添加到图层),您可以使用事务的完成块。

[CATransaction begin];
// Your animation here...
[CATransaction setCompletionBlock:^{
    // Completion here...
}];
[CATransaction commit];

使用委托回调

通过将自己设置为动画委托,您将在动画完成时获得委托回调。

animation4.delegate = self;

和回调

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
    // Completion here..
}
于 2013-01-14T13:48:22.363 回答