簡體   English   中英

iOS動畫:CADisplayLink與CAShapeLayer

[英]iOS Animation: CADisplayLink vs CAShapeLayer

我正在編寫一個計時器,類似於Clock應用程序的水平版本中可用的計時器,不同之處在於它開始已滿,然后逐漸運行為空。

我實現了該計時器,它在較大的時間內效果很好,但是它無法為快速動畫制作足夠快的動畫(我的目標是最快以400ms的總動畫時間),因為我使用drawRect方法制作了動畫。 為了說明這一點,這是我的計時器代碼:

class SSTimerView: UIView {
    var timer: NSTimer?
    var startAngle: CGFloat = (CGFloat) (M_PI * 1.5)
    var endAngle: CGFloat = (CGFloat) (M_PI * 1.5) + (CGFloat) (M_PI * 2)
    var percent: CGFloat? = 100 

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func drawRect(rect: CGRect) {
        var bezierPath = UIBezierPath()
        //Create our arc with the correct angles
        bezierPath.addArcWithCenter(CGPointMake(rect.size.width/2, rect.size.height/2),
            radius: 130,
            startAngle: startAngle,
            endAngle: (endAngle - startAngle) * (percent! / 100.0) + startAngle,
            clockwise: true
        )
        //Set the display for the path and stroke it.
        bezierPath.lineWidth = 20
        Slide.sharedInstance.currentInstruction!.colorFamily.lighterColor.setStroke()
        bezierPath.stroke()
    }
}

我一直在閱讀CADisplayLink,我認為這可能是一個可行的選擇,但我也聽說CADisplayLink不適合所有情況。 這是其中之一嗎? 如果CADisplayLink在這里不合適,我應該使用哪個CA類?

如您所知,手動設置CADisplayLink動畫總是比NSTimer更好。 (有關原因的討論,請參閱WWDC 2014視頻“ 構建可中斷和響應式交互” ,開始播放該視頻的時間大約為14分鍾。)因此,如果您堅持使用現有模式,請絕對轉向CADisplayLink

但是,如果要為該路徑的動畫制作動畫, CABasicAnimation會容易得多:

var shapeLayer: CAShapeLayer!

func addShapeLayer() {
    shapeLayer     = CAShapeLayer()
    let startAngle = CGFloat(M_PI * 1.5)
    let endAngle   = startAngle + CGFloat(M_PI * 2)

    let bezierPath = UIBezierPath()

    bezierPath.addArcWithCenter(CGPointMake(view.bounds.size.width/2, view.bounds.size.height/2),
        radius: 130.0,
        startAngle: startAngle,
        endAngle: endAngle,
        clockwise: true
    )

    shapeLayer.path        = bezierPath.CGPath
    shapeLayer.strokeColor = UIColor.blueColor().CGColor
    shapeLayer.fillColor   = UIColor.clearColor().CGColor
    shapeLayer.lineWidth   = 20.0

    view.layer.addSublayer(shapeLayer)
}

func animateShapeLayer() {
    let animation       = CABasicAnimation(keyPath: "strokeEnd")
    animation.duration  = 0.4
    animation.fromValue = 0.0
    animation.toValue   = 1.0
    shapeLayer.addAnimation(animation, forKey: "strokeEndAnimation")
}

如果您需要更多的自定義行為,則CADisplayLink方法非常CADisplayLink ,但是,如果您只想在一定時間內對路徑的繪制進行動畫處理,則CABasicAnimation最簡單(並且可能會提供最佳性能)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM