beginAnimation с For Statement не работает - PullRequest
0 голосов
/ 10 ноября 2011

-обновленный код-

-(void)animateDot {
    dotMotion.center = (*doodlePoints)[0];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationRepeatCount:100];
    for(int i = 1; i < doodlePoints->size(); i++){
        dotMotion.center = (*doodlePoints)[i];
    }

    [UIView commitAnimations];
}

У меня есть вектор точек, и я хочу, чтобы это делало анимацию от точки к точке.Я только получаю от 2-го до последнего работающего.ничего раньшеЕсть идеи?

Так что я попытался сделать это по-другому.Ничего такого.Мое приложение должно работать 3.x, поэтому я не могу использовать анимационные блоки.

Ответы [ 3 ]

1 голос
/ 12 ноября 2011

Еще лучше попробуйте следующее:

-(void) nextAnimation
{
    CGPoint point = [[self.animatePoints objectAtIndex:0] CGPointValue];
    [self.animatePoints removeObjectAtIndex:0];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationRepeatCount:100];
    dotMotion.center = point;
    [UIView commitAnimations];
}

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    if ([self.animatePoints count] > 0) {
        [self nextAnimation];
    }
}

-(void)animateDot {
    self.animatePoints = [NSMutableArray array];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
    for(int i = 1; i < doodlePoints->size(); i++){
        [self.animatePoints addObject:[NSValue valueWithCGPoint:(*doodlePoints)[i]]];
    }
    [self nextAnimation];
}

Это грубый пример загрузки отдельных точек в свойстве NSMutableArray, которое постепенно обрабатывается и очищается при завершении каждой анимации.Вы также можете легко использовать свойство внутреннего индекса для массива doodlePoints, но я сделал это так, если вам когда-нибудь понадобится передать другой набор точек.В моем примере мы установили делегат анимации и селектор обратного вызова, чтобы нам можно было рассказать о завершении каждой анимации.Затем мы планируем анимацию на следующую точку и удаляем ее из массива.

1 голос
/ 10 ноября 2011

Вам необходимо выйти из цикла for и вернуться из этого метода после каждого сегмента линии для каждого отображаемого сегмента анимации. Пользовательский интерфейс обновляется только после возврата в цикл выполнения пользовательского интерфейса.

Продолжить каждую итерацию цикла в другом методе отложенного или делегированного обратного вызова. Сохраните переменную iterrator в переменной экземпляра между методами.

0 голосов
/ 11 ноября 2011

Вы хотите что-то похожее на это (не проверено):

-(void)animateTo:(CGPoint) point {
    dotMotion.center = (*doodlePoints)[0];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationRepeatCount:100];
    dotMotion.center = point;
    [UIView commitAnimations];
}

-(void)animateDot {
    for(int i = 1; i < doodlePoints->size(); i++){
        [self animateTo:(*doodlePoints)[i]];
    }
}

Хотя вы, вероятно, не хотите планировать их одновременную работу.Возможно, вы захотите объединить анимацию в цепочку с помощью обратного вызова завершения анимации и запустить следующую по порядку после завершения каждой анимации. Отредактировано для форматирования

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