Мой рекомендуемый подход заключается в том, чтобы обернуть UIImage в UIImageView и использовать CAKeyframeAnimation для анимации слоя вашего UIImageView вдоль пути, который проходит через ваши три точки:
UIImage *image = [UIImage imageNamed:@"image.png"];
imageView = [[UIImageView alloc] initWithImage:image];
[mainView addSubview:imageView];
// Remember to remove the image view and release it when done with it
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.duration = 1.0f;
pathAnimation.calculationMode = kCAAnimationPaced;
pathAnimation.fillMode = kCAFillModeForwards;
pathAnimation.removedOnCompletion = NO;
CGMutablePathRef pointPath = CGPathCreateMutable();
CGPathMoveToPoint(pointPath, NULL, viewOrigin.x, viewOrigin.y);
CGPathAddLineToPoint(pointPath, NULL, point1.x, point1.y);
CGPathAddLineToPoint(pointPath, NULL, point2.x, point2.y);
CGPathAddLineToPoint(pointPath, NULL, point3.x, point3.y);
pathAnimation.path = pointPath;
CGPathRelease(pointPath);
[imageView.layer addAnimation:pathAnimation forKey:@"pathAnimation"];
Обратите внимание, что по умолчанию положение слоя находится в центре слоя. Если вы хотите переместить слой относительно другой контрольной точки, вы можете установить для свойства anchorPoint слоя значение (0,0, 0,0) для его верхнего левого угла (на iPhone) или (0,0, 1,0) для его нижнего осталось.
Кроме того, это не изменит кадр UIImageView, когда это будет сделано, поэтому, если вы обратитесь к этому кадру позже, вам, возможно, придется либо принять это во внимание, либо добавить обратный вызов метода делегата для окончания анимации. установить правильное значение.
Вы также можете заставить ваше изображение двигаться по кривым, а не по прямым линиям, заменив вызовы CGPathAddLineToPoint () на CGPathAddCurveToPoint ().
РЕДАКТИРОВАНИЕ (14.05.2009): я добавил недостающую строку pathAnimation.path = pointPath и изменил опечатку со ссылкой на curvedPath на pointPath.