UIView 动画和 UIButton 停止工作 b/c Home pressed - Swift 4
UIView Animation and UIButton stop working b/c Home pressed - Swift 4
我有一个执行 "breathing animation" 的 playButton
。当我按下按钮时,按钮工作正常。如果我按下设备的主页按钮然后重新打开应用程序,就会出现问题。重新打开后,playButton
没有 "breathing animation" 并且它不起作用(按下时没有任何反应)。
@IBOutlet weak var playButton: UIButton!
override func viewWillAppear(_ animated: Bool) {
UIView.animate(withDuration: 1.0,
delay: 0,
options: [.autoreverse, .repeat, .allowUserInteraction],
animations: {
self.playButton.transform = CGAffineTransform(scaleX: 1.175, y: 1.175)
},
completion: nil
)
}
我在以前的游戏应用程序中处理过这个问题,如果用户按下主页按钮或出现中断(来电),我需要保存并暂停游戏。所以,我很清楚:
func applicationDidBecomeActive() {}
func applicationWillResignActive() {}
func applicationDidEnterBackground() {}
但是,我不处理游戏状态、计时器、保存数据等需求。我只是希望我的按钮及其动画在按下主页按钮后重新打开应用程序时正常工作。
我也尝试使用 override func viewDidLayoutSubviews() {}
而不是 viewWillAppear
。但这没有用。
首先,如果您在按下 playButton
后在同一个 ViewController
(VC) 中有多个动画,那么这可以解释为什么它会变成return 从后台禁用。为什么?我不知道。但是我有一个类似的问题,并通过为最初设置为在我的 UIButton
被按下时发生的多个动画创建一个新的 class
和 VC 来解决它。在我的按钮 IBAction
中,我只是创建了一个 segue 到然后是新的 VC。
关于动画,您可以采用两种方式:1) 使用 CALayer 暂停和恢复动画,或者 2) 只需使用 NotificationCenter,甚至无需触及任何 AppDelegate 代码。我更喜欢简单的方法 b/c 它会节省时间和精力。因此,在按钮动画发生的 VC 中尝试此代码:
override func viewWillAppear(_ animated: Bool) {
NotificationCenter.default.addObserver(self, selector:#selector(goingToBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector:#selector(openingApp), name: UIApplication.willEnterForegroundNotification, object: nil)
UIView.animate(withDuration: 1.0,
delay: 0,
options: [.autoreverse, .repeat, .allowUserInteraction],
animations: {
self.playButton.transform = CGAffineTransform(scaleX: 1.175, y: 1.175)
},
completion: nil)
}
@objc func goingToBackground(){
playButton.transform = .identity
}
@objc func openingApp(){
self.view.layoutIfNeeded()
UIView.animate(withDuration: 1.0,
delay: 0.3,
options: [.autoreverse, .repeat, .allowUserInteraction],
animations: {
self.playButton.transform = CGAffineTransform(scaleX: 1.175, y: 1.175)}, completion: nil)
self.view.layoutIfNeeded()
}
我有一个执行 "breathing animation" 的 playButton
。当我按下按钮时,按钮工作正常。如果我按下设备的主页按钮然后重新打开应用程序,就会出现问题。重新打开后,playButton
没有 "breathing animation" 并且它不起作用(按下时没有任何反应)。
@IBOutlet weak var playButton: UIButton!
override func viewWillAppear(_ animated: Bool) {
UIView.animate(withDuration: 1.0,
delay: 0,
options: [.autoreverse, .repeat, .allowUserInteraction],
animations: {
self.playButton.transform = CGAffineTransform(scaleX: 1.175, y: 1.175)
},
completion: nil
)
}
我在以前的游戏应用程序中处理过这个问题,如果用户按下主页按钮或出现中断(来电),我需要保存并暂停游戏。所以,我很清楚:
func applicationDidBecomeActive() {}
func applicationWillResignActive() {}
func applicationDidEnterBackground() {}
但是,我不处理游戏状态、计时器、保存数据等需求。我只是希望我的按钮及其动画在按下主页按钮后重新打开应用程序时正常工作。
我也尝试使用 override func viewDidLayoutSubviews() {}
而不是 viewWillAppear
。但这没有用。
首先,如果您在按下 playButton
后在同一个 ViewController
(VC) 中有多个动画,那么这可以解释为什么它会变成return 从后台禁用。为什么?我不知道。但是我有一个类似的问题,并通过为最初设置为在我的 UIButton
被按下时发生的多个动画创建一个新的 class
和 VC 来解决它。在我的按钮 IBAction
中,我只是创建了一个 segue 到然后是新的 VC。
关于动画,您可以采用两种方式:1) 使用 CALayer 暂停和恢复动画,或者 2) 只需使用 NotificationCenter,甚至无需触及任何 AppDelegate 代码。我更喜欢简单的方法 b/c 它会节省时间和精力。因此,在按钮动画发生的 VC 中尝试此代码:
override func viewWillAppear(_ animated: Bool) {
NotificationCenter.default.addObserver(self, selector:#selector(goingToBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector:#selector(openingApp), name: UIApplication.willEnterForegroundNotification, object: nil)
UIView.animate(withDuration: 1.0,
delay: 0,
options: [.autoreverse, .repeat, .allowUserInteraction],
animations: {
self.playButton.transform = CGAffineTransform(scaleX: 1.175, y: 1.175)
},
completion: nil)
}
@objc func goingToBackground(){
playButton.transform = .identity
}
@objc func openingApp(){
self.view.layoutIfNeeded()
UIView.animate(withDuration: 1.0,
delay: 0.3,
options: [.autoreverse, .repeat, .allowUserInteraction],
animations: {
self.playButton.transform = CGAffineTransform(scaleX: 1.175, y: 1.175)}, completion: nil)
self.view.layoutIfNeeded()
}