2016-04-26 13 views
1

Ich möchte nur die position Eigenschaft einer Ebene von Punkt A zu Punkt B durch einen Bogen mit Mittelpunkt C und Radius R animieren. So einfach und doch ich fühle mich wie ich Core Animation in der Hälfte zu biegen, um dies zu tun.Ist es möglich, CAAnimation abzuleiten?

Es scheint, wie der ideale Weg wäre, einfach eine CAPropertyAnimation Unterklasse benutzerdefinierte zu erstellen, so etwas wie:

let anim = MyArcPropertyAnimation(keyPath: "position", center: CGPoint, radius: CGFloat) 
anim.fromValue = fromPoint 
anim.toValue = toPoint 
myLayer.addAnimation(anim, forKey: "positionArcAnimation") 

Aber ich kann keine Informationen über Subklassifizieren CAAnimation oder irgendetwas davon ist Derivate finden. Dasselbe scheint auch für CAValueFunction zu gelten, was ansonsten ebenfalls vielversprechend erscheint.

Hinweis: Ich habe es mit POP einfach genug ausgeführt, aber festgestellt, dass, as warned by a facebook engineer, war die Leistung zu langsam für meine Verwendung.

Antwort

2

Es scheint implizit aus der Dokumentation, dass CAAnimation nicht für Unterklassen entwickelt wurde. Außerdem werden die meisten Animationen im Windows-Server ausgeführt (backboardd) und Sie werden definitiv nicht backboardd Code ausführen können.

Wie auch immer, es klingt wie Sie können den gewünschten Effekt mit einem CAKeyframeAnimation bekommen. Setzen Sie die Eigenschaft path der CAKeyframeAnimation auf den Bogen, dem die Ebene folgen soll. Spielplatz Beispiel:

import UIKit 
import XCPlayground 

let view = UIView(frame: CGRectMake(0, 0, 400, 400)) 
view.backgroundColor = .whiteColor() 
let mover = UIView(frame: CGRectMake(0, 0, 10, 10)) 
mover.backgroundColor = .redColor() 
view.addSubview(mover) 
XCPlaygroundPage.currentPage.liveView = view 

let animation = CAKeyframeAnimation(keyPath: "position") 
let path = UIBezierPath(arcCenter: CGPointMake(200, 200), radius: 160, startAngle: 1, endAngle: 5, clockwise: true) 
animation.path = path.CGPath 
animation.duration = 2 
animation.calculationMode = kCAAnimationPaced 
mover.layer.addAnimation(animation, forKey: "position") 
mover.center = path.currentPoint 

Ergebnis:

playground demo

Verwandte Themen