在我的应用程序中,我有一个 CALayer 数组,我已经沿着 bezierPath 设置了动画。当我关闭并重新打开应用程序时,我的图层没有动画,并且与关闭应用程序之前的位置不同。我已经实现了两种方法,pauseLayer 和 resumeLayer,当我用我的应用程序中的两个按钮触发它们时,它们可以工作,但在关闭应用程序后它们将无法工作。代码如下
- (void)pauseLayers{
for(int y=0; y<=end;y++)
{
CFTimeInterval pausedTime = [car[y] convertTime:CACurrentMediaTime() fromLayer:nil];
car[y].speed = 0.0;
car[y].timeOffset = pausedTime;
standardUserDefaults[y] = [NSUserDefaults standardUserDefaults];
if (standardUserDefaults[y]) {
[standardUserDefaults[y] setDouble:pausedTime forKey:@"pausedTime"];
[standardUserDefaults[y] synchronize];
}
NSLog(@"saving positions");
}
}
-(void)resumeLayers
{
for(int y=0; y<=end;y++)
{
standardUserDefaults[y] = [NSUserDefaults standardUserDefaults];
car[y].timeOffset = [standardUserDefaults[y] doubleForKey:@"pausedTime"];
CFTimeInterval pausedTime = [car[y] timeOffset];
car[y].speed = 1.0;
car[y].timeOffset = 0.0;
car[y].beginTime = 0.0;
CFTimeInterval timeSincePause = [car[y] convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
car[y].beginTime = timeSincePause;
}
}
最佳答案
- (void)applicationDidEnterBackground:(UIApplication *)application {
mosquitosViewController *mvc = [[mosquitosViewController alloc] init];
[mvc pauseLayers];
}
你在上面尝试做的问题是你正在创建一个全新的 View Controller 实例,这不是屏幕上显示的那个。这就是为什么当您发送
pauseLayers
时什么也没有发生的原因信息。您应该做的是注册以接收您的应用程序何时进入和来自后台的通知,并在该通知到达时调用适当的方法(
pauseLayers
和 resumeLayers
)。您应该在
mosquitosViewController
的某处添加以下代码实现(我通常在 viewDidLoad 中这样做):// Register for notification that app did enter background
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(pauseLayers)
name:UIApplicationDidEnterBackgroundNotification
object:[UIApplication sharedApplication]];
// Register for notification that app did enter foreground
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(resumeLayers)
name:UIApplicationWillEnterForegroundNotification
object:[UIApplication sharedApplication]];
关于background - 从多任务处理回来后如何恢复 CAAnimation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6792701/