我有一個自定義的UIActivityIndicatorView。這是一個視圖,在它的圖層上有一個CAAnimation。問題如下:CABasicAnimation響應
我做了一些繁重的工作,並創造了很多意見。大約需要0.5秒。爲了保持順暢,我決定使用活動指標,但它「發生」。對於默認的活動指標,這一切都很好,但是我寫的那個我得到了意想不到的結果。
所以,當視圖加載時,我啓動我的活動指示器,它啓動動畫。當重型工作開始時,我的視圖凍結了0.5秒,當完成時我停止動畫並消失。這個「凍結」看起來非常不愉快。因爲這個想法是保持動畫,而其他視圖被初始化並添加爲子視圖(雖然隱藏)。
我懷疑問題是我的「活動指標」不是異步的,或者根本沒有正確編碼。
這裏是它的代碼:
class CustomActivityIndicatorView: UIView {
// MARK - Variables
var colors = [UIColor.greenColor(),UIColor.grayColor(),UIColor.blueColor(),UIColor.redColor()]
var colorIndex = 0
var animation: CABasicAnimation!
lazy var customView : UIView! = {
let frame : CGRect = CGRectMake(0.0, 0.0, 100, 100)
let view = UIView(frame: frame)
image.frame = frame
image.center = view.center
view.backgroundColor = UIColor.greenColor()
view.clipsToBounds = true
view.layer.cornerRadius = frame.width/2
return view
}()
var isAnimating : Bool = false
var hidesWhenStopped : Bool = true
var from: NSNumber = 1.0
var to: NSNumber = 0.0
var growing = false
override func animationDidStart(anim: CAAnimation!) {
}
override func animationDidStop(anim: CAAnimation!, finished flag: Bool) {
growing = !growing
if growing {
colorIndex++
if colorIndex == colors.count {
colorIndex = 0
}
println(colorIndex)
customView.backgroundColor = colors[colorIndex]
from = 0.0
to = 1.0
} else {
from = 1.0
to = 0.0
}
if isAnimating {
addPulsing()
resume()
}
}
// MARK - Init
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.addSubview(customView)
addPulsing()
pause()
self.hidden = true
}
// MARK - Func
func addPulsing() {
let pulsing : CABasicAnimation = CABasicAnimation(keyPath: "transform.scale")
pulsing.duration = 0.4
pulsing.removedOnCompletion = false
pulsing.fillMode = kCAFillModeForwards
pulsing.fromValue = from
pulsing.toValue = to
pulsing.delegate = self
let layer = customView.layer
layer.addAnimation(pulsing, forKey: "pulsing")
}
func pause() {
let layer = customView.layer
let pausedTime = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
layer.speed = 0.0
layer.timeOffset = pausedTime
isAnimating = false
}
func resume() {
let layer = customView.layer
let pausedTime : CFTimeInterval = layer.timeOffset
layer.speed = 1.0
layer.timeOffset = 0.0
layer.beginTime = 0.0
let timeSincePause = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) - pausedTime
layer.beginTime = timeSincePause
isAnimating = true
}
func startAnimating() {
if isAnimating {
return
}
if hidesWhenStopped {
self.hidden = false
}
resume()
}
func stopAnimating() {
let layer = customView.layer
if hidesWhenStopped {
self.hidden = true
}
pause()
layer.removeAllAnimations()
}
deinit {
println("Spinner Deinitied")
}
}
關於animationDidStop方法:
的想法如下。視圖脈動,收縮後,它再次開始增長,並且背景色被改變。
任何想法我做錯了什麼?
我發現了一個類似這裏的問題http://stackoverflow.com/questions/1614921/is-there-a-way-to-force-core-animation-to-run-its-thread。然而,它發生在2009年,而且我仍然試圖弄清楚我是否能夠在2015年第二個線程(CA定義的那個)上爲主線程分配視圖並運行簡單的動畫。因爲UIActivityIndicator在這種情況下工作正常。我的活動指標有什麼問題? –
我相信我找到了問題的根源。代理方法didStop和didStart(我重新啓動我的動畫)在主線程上執行,這就是爲什麼它們被阻塞,並且下一個動畫循環凍結,直到完成主線程上的計算。我會嘗試爲我的想法使用CAKeyFrameAnimation,並且很快會在這裏發佈結果。 –