我有一個imageView,並希望它始終旋轉360°,但我發現的問題是,當應用程序進入background
,然後回到,旋轉動畫將停止。 而我不想在應用程序回到前臺時重新調用函數rotate360Degree()
,原因是我希望旋轉動畫將在進入背景時離開的位置開始,而不是從0再次旋轉。 但是,當我呼叫功能resumeRotate()
,它不起作用。如何恢復核心動畫時,應用程序回到前臺
擴展如下:
extension UIImageView {
// 360度旋轉圖片
func rotate360Degree() {
let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation.z") // 讓其在z軸旋轉
rotationAnimation.toValue = NSNumber(value: .pi * 2.0) // 旋轉角度
rotationAnimation.duration = 20 // 旋轉週期
rotationAnimation.isCumulative = true // 旋轉累加角度
rotationAnimation.repeatCount = MAXFLOAT // 旋轉次數
rotationAnimation.autoreverses = false
layer.add(rotationAnimation, forKey: "rotationAnimation")
}
// 暫停旋轉
func pauseRotate() {
layer.pauseAnimation()
}
// 恢復旋轉
func resumeRotate() {
layer.resumeAnimation()
}
}
這裏是層擴展:
var pauseTime:CFTimeInterval!
extension CALayer {
//暫停動畫
func pauseAnimation() {
pauseTime = convertTime(CACurrentMediaTime(), from: nil)
speed = 0.0
timeOffset = pauseTime
}
//恢復動畫
func resumeAnimation() {
// 1.取出時間
pauseTime = timeOffset
// 2.設置動畫的屬性
speed = 1.0
timeOffset = 0.0
beginTime = 0.0
// 3.設置開始動畫
let startTime = convertTime(CACurrentMediaTime(), from: nil) - pauseTime
beginTime = startTime
}
}
我可以解決上述「停止」的問題與CADisplayLink,但動畫將不會從旋轉它離開的位置(始終旋轉)。 我想知道如何用CADisplayLink解決它? 以上核心動畫如何?
displayLink = CADisplayLink(target: self, selector: #selector(rotateImage))
displayLink.add(to: .current, forMode: .commonModes)
func rotateImage(){
let angle = CGFloat(displayLink.duration * Double.pi/18)
artworkImageView.transform = artworkImageView.transform.rotated(by: angle)
}
@Hi beyowulf。感謝您的詳細回覆。我會嘗試解決您的問題。但問題是持續時間不適用於後臺或前臺應用程序。它只涉及用戶的行爲。例如,該應用程序是音樂播放器,imageView用於音樂作品,用戶可以用後臺模式聽音樂30分鐘,2小時或更長時間。 – Ringo
我不明白你的意見。應用程序在後臺的持續時間可以是任何無關緊要,只要應用程序停留在內存中即可。我認爲問題是如何爲視圖設置動畫,以便在應用程序背景時恢復動畫,繼續播放,就好像它從未背景一樣。情況並非如此嗎? – beyowulf
哦,對不起,我誤解了你的代碼中的數字10。這是動畫的持續時間,而不是應用程序在後臺的時間。 – Ringo