ピンチ/ズームを同時に行うジェスチャを作成する方法を示す Stanford Uni Lectures / WWDC ビデオをいじってみました。CGAffineTransform
UIView に適用する を返します。
これはすべて正常に動作しますが、もう少し流動的にして、コードに減速を追加しようとしています。UIGestureRecognizerStateChanged
各呼び出しで変換マトリックスを保存することでこれを実行しようとしました。受信UIGestureRecognizerStateEnded
すると、最後の Changed マトリックスと Ended マトリックスの間のデルタを保存します。
- (void)handleTransform:(TransformGestureRecognizer *)transformRecognizer
{
CGAffineTransform transform = transformRecognizer.transform;
// cancel any previous animation updates
[UIView cancelPreviousPerformRequestsWithTarget:self selector:@selector(decelerateView:) object:transformRecognizer.view];
if(transformRecognizer.state == UIGestureRecognizerStateBegan)
{
transform = CGAffineTransformConcat(transformRecognizer.view.transform, transform);
transformRecognizer.transform = transform;
}
else if(transformRecognizer.state == UIGestureRecognizerStateChanged)
{
changingTransform = transform;
}
else if(transformRecognizer.state == UIGestureRecognizerStateEnded)
{
// get transform difference
releaseTransformDiff.a = (transform.a - changingTransform.a);
releaseTransformDiff.b = (transform.b - changingTransform.b);
releaseTransformDiff.c = (transform.c - changingTransform.c);
releaseTransformDiff.d = (transform.d - changingTransform.d);
releaseTransformDiff.tx = (transform.tx - changingTransform.tx);
releaseTransformDiff.ty = (transform.ty - changingTransform.ty);
// start updating deceleration animation
[self performSelector:@selector(decelerateView:) withObject:transformRecognizer.view afterDelay:1.0/60.0];
}
transformRecognizer.view.transform = transform;
}
次に、decelerateView:
減速をアニメーション化する方法があります。
#define DECELERATION_RATE 0.9
- (void)decelerateView:(UIView *)view
{
releaseTransformDiff.a = releaseTransformDiff.a * DECELERATION_RATE;
releaseTransformDiff.b = releaseTransformDiff.b * DECELERATION_RATE;
releaseTransformDiff.c = releaseTransformDiff.c * DECELERATION_RATE;
releaseTransformDiff.d = releaseTransformDiff.d * DECELERATION_RATE;
releaseTransformDiff.tx = releaseTransformDiff.tx * DECELERATION_RATE;
releaseTransformDiff.ty = releaseTransformDiff.ty * DECELERATION_RATE;
view.transform = CGAffineTransformMake(view.transform.a + releaseTransformDiff.a,
view.transform.b + releaseTransformDiff.b,
view.transform.c + releaseTransformDiff.c,
view.transform.d + releaseTransformDiff.d,
view.transform.tx + releaseTransformDiff.tx,
view.transform.ty + releaseTransformDiff.ty);
[self performSelector:@selector(decelerateView:) withObject:view afterDelay:1.0/60.0];
}
これは時々機能しますが、突然停止し、実際に回転スピンを減速させることはありません.2つのマトリックスのデルタを正しく計算していないと思います. これを行う正しい方法は何ですか?