我有一個定製的CALayer
子類,繪製一個圓弧。它看起來是這樣的:爲了CAAnimation的目的,將Swift結構轉換/包裝爲NSValue?
class ArcLayer: CALayer {
var strokeColor:UIColor = UIColor.blackColor() { didSet { self.setNeedsDisplay() }}
var strokeWidth:CGFloat = 1.0 { didSet { self.setNeedsDisplay() }}
var strokeCap:CGLineCap = .Butt { didSet { self.setNeedsDisplay() }}
var startRadians:CGFloat = 0.0 { didSet { self.setNeedsDisplay() }}
var sweepRadians:CGFloat = Tau { didSet { self.setNeedsDisplay() }}
// other init's omitted for brevity
override init(layer: AnyObject) {
super.init(layer: layer)
if let layer = layer as? ArcLayer {
self.strokeColor = layer.strokeColor
self.strokeWidth = layer.strokeWidth
self.strokeCap = layer.strokeCap
self.startRadians = layer.startRadians
self.sweepRadians = layer.sweepRadians
}
}
override func drawInContext(ctx: CGContext) {
...
}
override class func needsDisplayForKey(key: String) -> Bool {
return key == "startRadians" || key == "sweepRadians" || super.needsDisplayForKey(key)
}
}
我使用的是自定義子類,因爲同時CAShapeLayer
的path
是動畫,它不會在你所期望的弧線繞方式動畫。以上作品。開始/掃描的動畫產生所需的效果。
我想改變它。我有一個Angle
結構(請參閱this answer),我寧願使用比原始的弧度CGFloat值。將這兩個變量的類型更改爲Angle
編譯得很好。並且原始顯示也起作用(在從Angle
變量進行適當的轉換/提取之後)。問題是現在可以對這些變量進行動畫處理。凡爲我之前可能已經喜歡寫一些代碼:
let sweep = CABasicAnimation(keyPath: "sweepRadians")
sweep.fromValue = 0.0 // raw radians value
sweep.toValue = Tau // raw radians value for one rotation
sweep.duration = 10.seconds
sweep.repeatCount = 0
self.blueRing.addAnimation(sweep, forKey: "sweepRadians")
我不能改變那些Angle
值:
sweep.fromValue = Angle(raw: 0, unit: .Rotations)
sweep.toValue = Angle(raw: 0, unit: .Rotations)
這導致
cannot assign value of type 'Angle' to type of 'AnyObject?'
我希望解決方案是我需要以某種方式將我的Angle
值轉換/包裝爲NSValue對象?這確實是正確的嗎?可以做到嗎?怎麼會這樣?
我真的很喜歡Swift,但是與Objc相交的角落案例可能會讓人感到困惑。