Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 应用程序关闭时阻止动画完成_Ios_Swift_Xcode_Animation_Uiview - Fatal编程技术网

Ios 应用程序关闭时阻止动画完成

Ios 应用程序关闭时阻止动画完成,ios,swift,xcode,animation,uiview,Ios,Swift,Xcode,Animation,Uiview,我得到了一个动画,一辆汽车开到屏幕中间。当到达时,车停在那里,直到我回到这个视野,然后车又开回来了。但是,当我关闭应用程序时,汽车是在屏幕中部,关闭和重新打开应用程序,汽车隐藏在起始位置,而不是在屏幕中部。我认为动画完成了,carImage进入了起始位置。我怎样才能防止这种情况?我的猜测是,我必须在应用程序关闭时提醒carimage的位置,并在应用程序重新打开时将汽车放回该位置,但前提是汽车在应用程序关闭之前就在那里(否则动画将从屏幕中间开始,这将很糟糕) 为了更好地理解,我将向您展示一个快速的

我得到了一个动画,一辆汽车开到屏幕中间。当到达时,车停在那里,直到我回到这个视野,然后车又开回来了。但是,当我关闭应用程序时,汽车是在屏幕中部,关闭和重新打开应用程序,汽车隐藏在起始位置,而不是在屏幕中部。我认为动画完成了,carImage进入了起始位置。我怎样才能防止这种情况?我的猜测是,我必须在应用程序关闭时提醒carimage的位置,并在应用程序重新打开时将汽车放回该位置,但前提是汽车在应用程序关闭之前就在那里(否则动画将从屏幕中间开始,这将很糟糕)

为了更好地理解,我将向您展示一个快速的屏幕录制:

我在我的视图中看到:

 UIView.animate(withDuration: 4, animations: {
                   self.carImage.frame.origin.y += 139
                   self.carImage.frame.origin.x += 240
               }, completion: {(finished:Bool) in self.show()})
其中“carImage”是包含car.png的UIImageView。我已经手动将其放置在main.storyboard左侧的某个位置,这样就可以工作了


我知道,使用+=139等设置动画一点也不好,但因为我在视图中获得了carImage,它在所有设备上的大小都相同,所以它工作得非常完美。

您可以通过从视图层中删除所有动画来停止
UIView
块动画的动画:

self.carImage.layer.removeAllianimations()
如果仅此操作不起作用,则您还可以在停止动画之前存储视图的位置,并在应用程序处于后台时将其持久化:

让currentPositionFrame=self.carImage.layer.presentation()?.frame
self.carImage.layer.removeAllianimations()
请注意,
currentPositionFrame
将是一个
cRect?
,因此您必须处理选项,但这应该是合理的,因为您在打开屏幕时可能有或可能没有
carImage
的先前位置

更新:

为了在背景中保持汽车图像的状态,我将在视图控制器中概述其主要部分:

类MyViewController:UIViewController{
private var oldCarPosition:CGRect?=nil//在这里,当应用程序转到后台时,我们将存储位置
重写func viewDidLoad(){
super.viewDidLoad()
//其他设置代码
NotificationCenter.default.addObserver(self,选择器:#选择器(applicationWillEnterBackground(:)),名称:UIApplication.willResignActiveNotification,对象:nil)
NotificationCenter.default.addObserver(self,选择器:#选择器(applicationWillEnterForeground(:)),名称:UIApplication.willEnterForegroundNotification,对象:nil)
}
脱硝{
//别忘了取消订阅通知!
NotificationCenter.default.removeObserver(自)
}
@objc func applicationWillEnterBackground(uu通知:通知){
self.oldCarPosition=self.carImage.layer.presentation()?.frame
}
@objc func应用程序将进入前台(uu通知:通知){
guard let oldPosition=self.oldCarPosition else{return}
self.carImage.frame=oldPosition
}
}

您可以通过删除视图层中的所有动画来停止
UIView
块动画的动画:

self.carImage.layer.removeAllianimations()
如果仅此操作不起作用,则您还可以在停止动画之前存储视图的位置,并在应用程序处于后台时将其持久化:

让currentPositionFrame=self.carImage.layer.presentation()?.frame
self.carImage.layer.removeAllianimations()
请注意,
currentPositionFrame
将是一个
cRect?
,因此您必须处理选项,但这应该是合理的,因为您在打开屏幕时可能有或可能没有
carImage
的先前位置

更新:

为了在背景中保持汽车图像的状态,我将在视图控制器中概述其主要部分:

类MyViewController:UIViewController{
private var oldCarPosition:CGRect?=nil//在这里,当应用程序转到后台时,我们将存储位置
重写func viewDidLoad(){
super.viewDidLoad()
//其他设置代码
NotificationCenter.default.addObserver(self,选择器:#选择器(applicationWillEnterBackground(:)),名称:UIApplication.willResignActiveNotification,对象:nil)
NotificationCenter.default.addObserver(self,选择器:#选择器(applicationWillEnterForeground(:)),名称:UIApplication.willEnterForegroundNotification,对象:nil)
}
脱硝{
//别忘了取消订阅通知!
NotificationCenter.default.removeObserver(自)
}
@objc func applicationWillEnterBackground(uu通知:通知){
self.oldCarPosition=self.carImage.layer.presentation()?.frame
}
@objc func应用程序将进入前台(uu通知:通知){
guard let oldPosition=self.oldCarPosition else{return}
self.carImage.frame=oldPosition
}
}

谢谢,但我不是舒尔,我不知道如何使用它。在我制作动画之后,我尝试添加revomeAllAnimations(),但是当我启动应用程序时,汽车已经在屏幕中间了。如果我在动画之前添加它,它就像以前一样。我应该把所有的行李放在哪里。。我该如何处理这个问题呢?
let currentPosition
片段应该添加到一个函数中,该函数在应用程序进入后台时调用。事实上,您可能不需要
removeAllAnimations()
零件,而只使用汽车的旧位置。如果你需要,我可以编辑我的答案,告诉你当应用程序进入后台时如何执行代码。是的,那太好了!非常感谢弗拉德格拉德,我能帮上忙!:)谢谢,但我不是舒尔,我如何使用它。我试过了