Переместить UIImageView - PullRequest
       16

Переместить UIImageView

4 голосов
/ 14 мая 2009

Каков наилучший способ перемещения изображения по массиву точек?

Ответы [ 2 ]

9 голосов
/ 14 мая 2009

Мой рекомендуемый подход заключается в том, чтобы обернуть 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.

1 голос
/ 14 мая 2009

Самый простой способ - использовать UIView анимации

Быстрый пример, предполагающий, что вы можете использовать UIImageView для удержания изображения и NSArray для удержания вашей точки.

    UIImage *image = [UIImage imageNamed:@"image.png"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

    [someView addSubview:imageView]; // Assume someView exists

    NSValue *firstPoint = [NSValue valueWithCGPoint:CGPointMake(0, 0)];
    NSValue *secondPoint = [NSValue valueWithCGPoint:CGPointMake(100, 0)];
    NSValue *thirdPoint = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
    // And so on....

    NSArray *points = [NSArray arrayWithObjects:firstPoint, secondPoint, thirdPoint, nil];

    for (NSValue *pointValue in points) {

        [UIView beginAnimations:@"UIImage Move" context:NULL];

        CGPoint point = [pointValue CGPointValue];
        CGSize size = imageView.frame.size;

        imageView.frame = CGRectMake(point.x, point.y, size.width, size.height);

        [UIView commitAnimations];
    }
...