我想要执行一些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]
。所以在1.9秒后调用goToSolutionViewController
而不是0.9。
在动画结束之前,我该怎么做才能推动UIViewController?或者,当我弹出CALayers
时,UIViewController
回到原始位置,但用户无法看到回来的路径。
编辑:---
此性能问题仅在我第一次执行动画并推送UIViewcontroller时发生。当我弹出它并再次做所有事情时,表现就像幽灵一样。问题可能出在第一次UIViewController加载时间。
答案 0 :(得分:1)
与延迟后执行相比,您应该使用其中一个动画回调来调用您的方法,而不是依赖于动画的时间。您可以使用允许使用块的CATransaction,也可以使用普通的委托方法。
通过在事务中包装动画(将其添加到图层),您可以使用事务的完成块。
[CATransaction begin];
// Your animation here...
[CATransaction setCompletionBlock:^{
// Completion here...
}];
[CATransaction commit];
通过将自己设置为动画委托,您可以在动画完成时获得委托回调。
animation4.delegate = self;
回调
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
// Completion here..
}