Преобразование CGPoints из одного представления в другое относительно анимации

Я пытаюсь сделать анимацию, в которой я перемещаю один CGPoint из одного представления в другое, я хочу найти координаты, где точка будет ориентироваться на первую, чтобы я мог сделать анимацию.

Итак, скажем, у меня есть точка (24,15) в представлении2, и я хотел бы оживить ее для просмотра1, я все равно хочу сохранить значение точки в новом представлении, поскольку я добавляю точку как подвид нового вида, но для анимации мне нужно знать значение, где будет точка, чтобы я мог сделать анимацию.

Пожалуйста, обратитесь к этому графику:

enter image description here

Теперь это то, что я пытаюсь сделать:

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;

Любые идеи?

Ответ 1

Легче видеть с блочными анимациями. Я думаю, что цель состоит в том, чтобы сделать анимацию view2 subview в ней координатным пространством, а затем, когда анимация закончена, добавьте subview в view1, используя конечную позицию, преобразованную в новое пространство координат.

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

// compute the end point in view2 coords, that 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 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, если вектор смещения перемещает точку за пределами ее границ.