2015-08-14 30 views
0

我有一個自定義的UIActivityIndi​​catorView。這是一個視圖,在它的圖層上有一個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方法:

的想法如下。視圖脈動,收縮後,它再次開始增長,並且背景色被改變。

任何想法我做錯了什麼?

+0

我發現了一個類似這裏的問題http://stackoverflow.com/questions/1614921/is-there-a-way-to-force-core-animation-to-run-its-thread。然而,它發生在2009年,而且我仍然試圖弄清楚我是否能夠在2015年第二個線程(CA定義的那個)上爲主線程分配視圖並運行簡單的動畫。因爲UIActivityIndi​​cator在這種情況下工作正常。我的活動指標有什麼問題? –

+0

我相信我找到了問題的根源。代理方法didStop和didStart(我重新啓動我的動畫)在主線程上執行,這就是爲什麼它們被阻塞,並且下一個動畫循環凍結,直到完成主線程上的計算。我會嘗試爲我的想法使用CAKeyFrameAnimation,並且很快會在這裏發佈結果。 –

回答

0

使用CAKeyFrameAnimation解決它以達到相同的效果。對於存在相同問題的所有人,請記住animationDidStart和animationDidStop開始在主線程上運行,以便無論您如何處理動畫,主線程都會處於忙碌狀態。