gpt4 book ai didi

ios - performSelector:withObject:afterDelay 在 CALayer 动画结束后调用

转载 作者:行者123 更新时间:2023-11-29 13:21:08 35 4
gpt4 key购买 nike

我想为一些 CALayer 的位置制作动画。在动画结束之前,我想推送另一个 UIViewController,这样当我弹出最后一个 UIView Controller 时,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?或者在我弹出 UIViewController 但用户看不到返回路径时让 CALayers 回到原来的位置。

编辑:---

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

最佳答案

与在延迟后执行相比,您不应依赖动画的时间,而应使用其中一个动画回调来调用您的方法。您可以使用 CATransaction,这将允许您使用 block ,也可以使用普通的委托(delegate)方法。

使用 CATransaction

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

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

使用委托(delegate)回调

通过将自己设置为动画委托(delegate),您可以在动画结束时获得委托(delegate)回调。

animation4.delegate = self;

和回调

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
// Completion here..
}

关于ios - performSelector:withObject:afterDelay 在 CALayer 动画结束后调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14319159/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com