2015-08-14 32 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开始在主线程上运行,以便无论您如何处理动画,主线程都会处于忙碌状态。