Скажем, я хочу анимировать шар, катящийся на 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 пикселей):
Я хочу, чтобы мой метод обратного вызова вызывался всякий раз, когда мяч достигал 250 пикселей.Из-за функции синхронизации первые 250 пикселей могут быть достигнуты за ti 0 = 2 секунды, половина общей дистанции, достигнутой всего за ti 1 = 0,7 секунды спустя (быстрое ускорение начинается), 750px отмечают еще ti 2 = 1,1 секунды спустя, а оставшиеся ti 3 = 5,2 секунды требуют для достижения отметки 100% (1000px).
Что было бы здорово, но не предоставлено:
Если анимация вызвала метод делегата в интервалах хода анимации, как описано, мне не нужно было бы задавать этот вопрос… ;-)
Идеи, как решить проблему:
Одно решение, которое я могу придумать, - это вычислить значения кривой Безье, сопоставить их с ti k * 1037.* значения (мы знаем общую продолжительность анимации), и когда анимация запускается, мы последовательно выполняем селектор animationProgresssCallback:
с этими задержками вручную.
Очевидно, что это безумие (вычисление кривых Безье вручную ??)и, что более важно, ненадежный (мы можемне полагайтесь на поток анимации и основной поток для синхронизации - или мы можем?).
Любые идеи ??
Ожидание ваших идей!