我正在使用此代碼在我的應用程式中創建旋轉影片:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver( self, selector: #selector(ViewController.applicationDidBecomeActive(notification:)),
name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil)
NotificationCenter.default.addObserver( self, selector: #selector(ViewController.applicationDidEnterBackground(notification:)), name:NSNotification.Name.UIApplicationDidEnterBackground, object: nil)
animationStatus(true)
}
func animationStatus(_ enable: Bool) {
if enable {
if vinylStatus == "true" {
resumeLayer(layer: vinylView.layer)
} else {
rotateImageView()
resumeLayer(layer: vinylView.layer)
}
} else {
pauseLayer(layer: vinylView.layer)
}
}
func rotateImageView() {
vinylStatus = "true"
UIView.animate(withDuration: 3, delay: 0, options: .curveLinear, animations: {
self.vinylView.transform = self.vinylView.transform.rotated(by: .pi / 2)
}) { (finished) in
if finished {
self.rotateImageView()
}
}
}
func pauseLayer(layer: CALayer) {
let pausedTime: CFTimeInterval = layer.convertTime(CACurrentMediaTime(), from: nil)
layer.speed = 0.0
layer.timeOffset = pausedTime
}
func resumeLayer(layer: CALayer) {
let pausedTime: CFTimeInterval = layer.timeOffset
layer.speed = 1.0
layer.timeOffset = 0.0
layer.beginTime = 0.0
let timeSincePause: CFTimeInterval = layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime
layer.beginTime = timeSincePause
}
但是我想在應用程式被隱藏和重新打開后繼續影片,我使用了這段代碼,但影片停止了,它不起作用。如何解決這個問題?
@objc func applicationDidBecomeActive(notification: NSNotification) {
print("applicationDidBecomeActive")
}
@objc func applicationDidEnterBackground(notification: NSNotification) {
//pauseLayer(layer: vinylView.layer)
}
}
更新
我不明白。例如在applicationDidBecomeActive 我只有這個代碼:print("applicationDidBecomeActive"). 如果我打開控制中心或通知中心并在除錯中回傳應用程式,我會得到這個applicationDidBecomeActive但我的影片不會停止。但是,如果我隱藏應用程式并回傳或鎖定 iPhone 并回傳應用程式,我也會在除錯中得到它,applicationDidBecomeActive但在這種情況下影片會停止。為什么會發生這種情況?
uj5u.com熱心網友回復:
TLDR;
當應用程式進入前臺時,您不需要復雜的開始-暫停-恢復-停止代碼來繼續影片。
你并不需要observe的applicationDidBecomeActive和applicationDidEnterBackground事件,無論是。
相反,觀察applicationWillEnterForeground事件,并rotateImageView從viewDidLoad(最初啟動影片)呼叫函式,并在applicationWillEnterForeground從后臺模式回傳時在回呼中重新啟動它。
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver( self, selector: #selector(AnimationContinuationViewController.applicationWillEnterForeground(notification:)), name:UIApplication.willEnterForegroundNotification, object: nil)
self.rotateImageView()
}
@objc func applicationWillEnterForeground(notification: NSNotification) {
print("applicationWillEnterForeground")
self.rotateImageView()
}
這將修復影片并從停止的地方繼續影片(在進入背景時)。
所以現在,您還可以洗掉vinylStatus、animationStatus、pauseLayer、resumeLayer和其他狀態處理函式,除非它們用于不同的目的。
更多細節:
當您打開控制中心(或通知中心)時,應用程式只會變成inactive,并active在覆寫(控制中心或通知中心)被關閉時變成。
當手機被鎖定,或者你進入主螢屏時,應用程式實際上進入后臺。
iOS 應用程式在后臺時不會執行任何 UI 代碼,因此當您從后臺模式回傳時,您需要重新啟動影片。
有關這方面的更多詳細資訊,請參閱
uj5u.com熱心網友回復:
只需再次呼叫影片功能
@objc func applicationDidBecomeActive(notification: NSNotification) {
animationStatus(true)
}
@objc func applicationDidEnterBackground(notification: NSNotification) {
animationStatus(false)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/359290.html
