Сохранить след анимированного изображения - PullRequest
1 голос
/ 21 июля 2009

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

Что я хочу сделать, так это оставить след от шин.

Кто-нибудь может предложить стратегию, как это сделать?

Просматривая другие темы, я видел этот фрагмент, не уверен, что смогу его использовать:

UIGraphicsBeginImageContext(drawingView.bounds.size);
[drawingView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//then display viewImage in another UIImageView...

Если бы его можно было использовать, какая-нибудь подсказка, как вызвать его во время анимации?

Ответы [ 2 ]

1 голос
/ 21 июля 2009

Этот фрагмент не совсем то, что вы ищете. Этот фрагмент сохраняет то, что в данный момент отображается в контексте, как UIImage. Вы также можете использовать ImageContext для рисования, но не так.

0 голосов
/ 06 января 2010

Идеальным было бы, если CAKeyframeAnimation уведомил своего делегата перед выполнением следующего ключевого кадра; так как я не думаю, что это возможно (?), единственный способ, которым я могу думать о чем-то подобном, - это использовать массив позиций и использовать последовательные экземпляры CABasicAnimation для этого. Это похоже на анимацию CAKeyframeAnimation для «бедняка».

Примерно так:

- (void)viewDidLoad 
{
    [super viewDidLoad];

    _step = 0;
    _positions = [[NSArray alloc] initWithObjects:[NSValue valueWithCGPoint:CGPointMake(20.0, 20.0)],
                 [NSValue valueWithCGPoint:CGPointMake(40.0, 80.0)],
                 [NSValue valueWithCGPoint:CGPointMake(60.0, 120.0)],
                 [NSValue valueWithCGPoint:CGPointMake(80.0, 160.0)],
                 [NSValue valueWithCGPoint:CGPointMake(100.0, 200.0)],
                 [NSValue valueWithCGPoint:CGPointMake(120.0, 240.0)],
                 [NSValue valueWithCGPoint:CGPointMake(140.0, 280.0)],
                 [NSValue valueWithCGPoint:CGPointMake(160.0, 320.0)],
                 [NSValue valueWithCGPoint:CGPointMake(180.0, 360.0)],
                 [NSValue valueWithCGPoint:CGPointMake(200.0, 400.0)],
                 nil];
    [self moveToNextPosition];
}

- (void)moveToNextPosition
{
    if (_step < [_positions count] - 1)
    {
        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
        animation.fromValue = [_positions objectAtIndex:_step];
        animation.toValue = [_positions objectAtIndex:(_step + 1)];
        animation.delegate = self;
        animation.removedOnCompletion = YES;
        [_sprite.layer addAnimation:animation forKey:@"position"];

        ++_step;
    }
    else 
    {
        _sprite.center = [[_positions objectAtIndex:_step] CGPointValue];
    }
}

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)finished
{
    UIImageView *trail = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"sprite.png"]];
    trail.center = [[_positions objectAtIndex:_step] CGPointValue];
    [self.view insertSubview:trail belowSubview:_sprite];
    [trail release];

    [self moveToNextPosition];
}

В этом случае анимации выполняются одна за другой со значениями, указанными в параметре _positions NSArray ivar, а шаг _ увеличивается на каждом шаге. Когда каждая анимация останавливается, мы рисуем изображение спрайта ниже того, которое мы анимируем, и перезапускаем нашу анимацию, пока не останется больше точек для перехода. И тогда мы закончим.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...