CAAnimation, которая вызывает метод в периодических интервалах анимации? - PullRequest
3 голосов
/ 15 июля 2010

Скажем, я хочу анимировать шар, катящийся на 1000 пикселей вправо, с указанием функции синхронизации в процессе - что-то вроде этого:

UIView *ball = [[UIView alloc] initWithFrame:CGRectMake(0,0,30,30)];
CABasicAnimation* anim =
        [CABasicAnimation animationWithKeyPath:@"transform.translation.x"];
anim.toValue = [NSNumber numberWithFloat:ball.frame.origin.x + 1000.0];
                                            // move 1000 pixels to the right
anim.duration = 10.0;
anim.timingFunction = [CAMediaTimingFunction functionWithControlPoints:
                      0.1 :0.0 :0.3 :1.0]; // accelerate fast, decelerate slowly
[ball.layer addAnimation:anim forKey:@"myMoveRightAnim"];

Что я в конечном итоге хочу , так этоиметь метод, скажем -(void)animationProgressCallback:(float)progress, вызываемый во время анимации, через регулярные интервалы хода анимации в терминах абсолютного «расстояния» между начальными и конечными значениями , то есть игнорируя функцию синхронизации.

Я попытаюсь объяснить с помощью приведенного выше примера, что шар катится на 1000 пикселей вправо (на графике по оси Y, в нашем случае 100% = 1000 пикселей):

alt text

Я хочу, чтобы мой метод обратного вызова вызывался всякий раз, когда мяч достигал 250 пикселей.Из-за функции синхронизации первые 250 пикселей могут быть достигнуты за ti 0 = 2 секунды, половина общей дистанции, достигнутой всего за ti 1 = 0,7 секунды спустя (быстрое ускорение начинается), 750px отмечают еще ti 2 = 1,1 секунды спустя, а оставшиеся ti 3 = 5,2 секунды требуют для достижения отметки 100% (1000px).

Что было бы здорово, но не предоставлено:

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

Идеи, как решить проблему:

Одно решение, которое я могу придумать, - это вычислить значения кривой Безье, сопоставить их с ti k * 1037.* значения (мы знаем общую продолжительность анимации), и когда анимация запускается, мы последовательно выполняем селектор animationProgresssCallback: с этими задержками вручную.

Очевидно, что это безумие (вычисление кривых Безье вручную ??)и, что более важно, ненадежный (мы можемне полагайтесь на поток анимации и основной поток для синхронизации - или мы можем?).

Любые идеи ??

Ожидание ваших идей!

1 Ответ

1 голос
/ 15 июля 2010

Идеи, как решить проблему:

Одно решение, которое я могу придумать, - это вычислить значения кривой Безье, сопоставить их со значениями тиков (мы знаем общую продолжительность анимации), и когдаанимация запускается, мы последовательно выполняем нашу animationProgresssCallback: селектор с этими задержками вручную.

Очевидно, что это безумие (вычисление кривых Безье ??) и, что более важно, ненадежно (мы не можем полагаться напоток анимации и основной поток должны быть синхронизированы - или мы можем?).

На самом деле это надежно.CoreAnimation основана на времени, так что вы можете использовать делегата, чтобы получать уведомления, когда анимация действительно начинается.А что касается вычисления пути Безье ... хорошо, посмотрите на это так: может быть хуже, если вы захотите реализовать поверхность в OpenGLES, вам придется вычислять кубический Безье !.лол.Ваш случай - только одно измерение, это не так сложно, если вы знаете математику.

...