Проблема здесь в том, что невозможно указать функцию синхронизации для анимации на основе UIView.Насколько я могу судить, у вас останется множество неприятных опций:
- Переключитесь на использование анимации на основе CALayer - с серьезной проблемой: если делегат установлен на представление, анимацияне бываетТак как это требуется для UIViews, это неинтересная опция.
- Добавьте родительский слой к вашим представлениям и анимируйте этот слой - с такой же серьезной проблемой, что этот слой нигде не будет находиться в перо, и внесите изменения в пероможет непреднамеренно нарушить анимацию.
- Не использовать пользовательскую функцию синхронизации.
Я взломал свой путь, установив делегат равным нулю перед анимацией, и вернув обратно в UIView.сразу после этого, но кажется очень грязным.Я могу что-то упустить, хотя.Мой код выглядит примерно так:
- (void)methodThatAnimates {
[CATransaction begin]; {
/* Must set to nil, otherwise the view just jumps to the new location. */
self.viewToAnimate.layer.delegate = nil;
CAMediaTimingFunction *timingFunction =
[CAMediaTimingFunction functionWithControlPoints:0.4 :0 :0 :1.0];
[CATransaction setAnimationTimingFunction:timingFunction]
self.viewToAnimate.layer.position = CGPoint(15.0, 0.0);
/* Set delegate back to the view, as is required per the
Apple documentation. */
self.viewToAnimate.layer.delegate = self.viewToAnimate;
} [CATransaction commit];
}
Пока что, похоже, он работает как шарм, но я все еще ожидаю появления какого-то странного артефакта из-за временно нулевого делегата.