2012年10月5日金曜日

CAMediaTimingFunctionの謎。

そういえばIntrospectionで得たprivateメソッドの情報って書いていいんでしょうか。本に載ってたりするからたぶんNDA違反じゃないよね。

----

androidでイージング関数の生成の役割を果たすInterpolator(3.0以降はTimeInterpolator)は、独自にオーバライドしてその挙動を自由に操作できます。なのでレガシーアニメーションAPIで、円でもリサージュ曲線でも数学的に軌道を記述可能なアニメーションを簡単に実行できます。

一方のiOSではCAMediaTimingFunctionがそのポジションなんですけど、getInterpolationに相当するメソッドが存在しないので、2点の制御点を用いて表せるベジエ曲線が限界になります。

+functionWithControlPoints::::

普通のAPIだとセレクタにくどい説明ラベルが付いていることが多いのですけど(controlPointX:y:nextPointX:y:みたいな)、通常利用を想定していないのか何も書いてません。

始点を(0,0)、終点を(1,1)としたベジエ曲線の、2つの制御点を指定します。例えばオーバーシュートなら制御点1(0.25,-1.0)、制御点2(0.75, 2.0)とかでしょうか。この値をそのまま並べて、

[CAMediaTimingFunction functionWithControlPoints:0.25:-1.0:0.75:2.0];

とやると多分それっぽいイージングが作れます。イージング関数は調べれば出てきますが、それを制御点に落とし込むのは結構大変な気がします…。

----

getInterpolationに相当するメソッドはない、と書きましたが、実際には存在するのです。

Introspectionでメソッドを洗い出すと、

-(float)_sloveForInput:(float)

というメソッドが見つかります。

しかし実際にアニメーション実行時に呼ばれるのは、getControlPointAtIndex:values:だけです。getControlPointAtIndex:values:は、initで与えた制御点の座標となる4つのfloat値について、0~4のindexに対して、出力引数で返すだけのメソッドみたいです。

MacOS系では使われているものの、iOSでは使われていないメソッドなんでしょうか…。

0 件のコメント:

コメントを投稿