2016-04-26 11 views
1

レイヤーのpositionプロパティを点Aから点Bに、中心点Cと半径Rの円弧でアニメーション化したいだけです。単純ですが、コアアニメーションを半分に曲げようとしているような気がします。CAAnimationのサブクラス化は可能ですか?

理想的な方法は、単にカスタムCAPropertyAnimationサブクラス、のようなものを作成することですように思える:

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

をしかし、私はサブクラス化CAAnimationまたはそれの誘導体のいずれか上の任意の情報を見つけることができません。他の点では有望であると思われるCAValueFunctionの場合も同様です。

注:私はPOPを使って実行していますが、as warned by a facebook engineerというパフォーマンスが私の使用には遅すぎることがわかりました。

答えて

2

CAAnimationはサブクラス化のために設計されていないことがドキュメントから暗示されているようです。また、ほとんどのアニメーションはウィンドウサーバー(backboarddと呼ばれます)で実行され、コードを実行するためにはbackboarddを取得できません。

とにかく、CAKeyframeAnimationを使用して効果を得られるように聞こえます。 CAKeyframeAnimationpathプロパティを、レイヤーに従わせる円弧に設定します。遊び場例:

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 

結果:

playground demo

関連する問題