[英]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.