我有一个自定义的UIActivityIndi​​catorView。这是一个视图,其图层上带有CAAnimation。问题如下:

我做了一些繁重的工作,并创建了很多视图。大约需要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方法:

这个想法如下。视图脉动,缩小后,视图又开始增长,并且背景色也发生了变化。

关于我在做什么错的任何想法吗?

最佳答案

使用CAKeyFrameAnimation解决了该问题,以实现相同的效果。对于遇到相同问题的每个人,请记住animationDidStart和animationDidStop开始在主线程上运行,因此,如果主线程繁忙,对动画所做的任何操作都将停止。

关于ios - CABasicAnimation响应度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32000705/

10-10 14:47