12

1 つの CGPoint をあるビューから別のビューに移動するアニメーションを実行しようとしています。アニメーションを実行できるように、最初のポイントを参照してポイントが配置される座標を見つけたいと考えています。

ビュー 2 にポイント (24,15) があり、それをビュー 1 にアニメーション化したいとしましょう。ポイントをサブビューとして追加しているので、新しいビュー内にポイントの値を保持したいと考えています。新しいビューですが、アニメーションでは、トゥイーンを実行できるように、ポイントがどこにあるかの値を知る必要があります。

このグラフを参照してください。

ここに画像の説明を入力

今、これは私がやろうとしていることです:

customObject *lastAction = [undoStack pop];
customDotView *aDot = lastAction.dot;
CGPoint oldPoint = aDot.center;
CGPoint  newPoint = lastAction.point;

newPoint = [lastAction.view convertPoint:newPoint toView:aDot.superview];


CABasicAnimation *anim4 = [CABasicAnimation animationWithKeyPath:@"position"];
anim4.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
anim4.fromValue = [NSValue valueWithCGPoint:CGPointMake(oldPoint.x, oldPoint.y )];
anim4.toValue = [NSValue valueWithCGPoint:CGPointMake( newPoint.x,  newPoint.y )];
anim4.repeatCount = 0;
anim4.duration = 0.1;
[aDot.layer addAnimation:anim4 forKey:@"position"];


[aDot removeFromSuperview];


[lastAction.view addSubview:aDot];
[lastAction.view bringSubviewToFront:aDot];

aDot.center = newPoint;

何か案は?

4

1 に答える 1

9

ブロックアニメーションで見やすくなります。目的は、その座標空間でview2サブビューのアニメーションを作成し、アニメーションが終了したら、新しい座標空間に変換された終了位置を使用して、view1にサブビューを追加することだと思います。

// assume we have a subview of view2 called UIView *dot;
// assume we want to move it by some vector relative to it's initial position
// call that CGPoint offset;

// compute the end point in view2 coords, that's where we'll do the animation
CGPoint endPointV2 = CGPointMake(dot.center.x + offset.x, dot.center.y + offset.y);

// compute the end point in view1 coords, that's where we'll want to add it in view1
CGPoint endPointV1 = [view2 convertPoint:endPointV2 toView:view1];

[UIView animateWithDuration:1.0 animations:^{
    dot.center = endPointV2;
} completion:^(BOOL finished) {
    dot.center = endPointV1;
    [view1 addSubview:dot];
}];

view1にドットを追加すると、view2からドットが削除されることに注意してください。また、view1が必要clipsToBounds == NOな場合、オフセットベクトルがドットをその境界の外側に移動するかどうかにも注意してください。

于 2012-09-08T23:37:50.833 に答える