не только CGPath
непрозрачна, но и CAAnimation
не поддерживает никаких обновлений и уведомлений о текущей анимации (то есть после того, как началась, но до завершения). Единственными вовлеченными объектами являются сама анимация и CALayer
-s, к которой применяется.
Итак, варианты:
(некоторые опции могут показаться слишком страшно, но они не являются, так что я сделал пример проекта, смотри ниже)
RepeatCount
Как wj2061 упоминалось это his answer вас может настроить анимацию repeatCount
. Против это будет живой 0,25 времени анимации, а не 0,25 траектории
CAShapeLayer
Если, случайно, вы можете представить свой сегмент ticker
с CAShapeLayer
, то вы можете оживить strokeStart
и strokeEnd
так он будет выглядеть сегмент движется по пути
Clever RepeatCount
можно рассчитать такую repeatCount
значение, анимация остановится на 0.25 пути.
- захватить некоторые Безье Lib
- экстракта Безье из функции синхронизации с
getControlPointAtIndex:
- решить Безье, чтобы получить его «значение прогресса» (обычно называемый
t
), для которого «у» значения Безье будет соответствовать к вашему «требуется прогресс» 'х' значение (0.25)
- CALCulate Безье для этого
t
- это точное значение repeatCount
вам нужно
Anim живать с CAAnimation, все сами
родом передового
- захватить некоторые Безье Lib
- создание пользовательских CALayer подкласса с динамическим свойством, скажем
rideProgress
- адда синтезированных свойств пути Безье (от Безье lib, а не CGPath) и подслоя (скажем,
rideLayer
) для анимации
- переопределение
needsDisplayForKey:
для rideProgress
ключ и initWithLayer:
для всех введенных объектов НО использовать self.rideLayer?.presentationLayer()
вместо копирования rideLayer
- переопределить один из них:
drawInContext:
и нарисовать то, что вам нужно; или (лучше) display
, в display
извлекает ток rideProgress
значение от presentationLayer
и обновляет подуровень, затем вызывает супер. В любом случае, использовать Безье Lib, чтобы вычислить положение и вращение для подуровня соответственно к текущему значению rideProgress
- не забудьте
CATransaction.setDisableActions(true)
перед установкой любого Animatable свойства любого слоя
- , наконец, использовать любой вид CAAnimation или неявной анимацию на
rideProgress
недвижимость
путь Split
Опять же, предложенный wj2061. Вы можете разделить путь, чтобы одна из половинок будет представлять 0,25 оригинального
Here является примером реализации всего выше КРОМЕ «Split путь». Я не проводил полевых испытаний этого кода, это просто рабочая концепция. XCode 7.3.1, Swift.
Используемые материалы: Wiki on Cubic function, Great article about operations on beziers, Cubic equations solving method line-by-line
Проблема заключается в том, что анимация не будет останавливаться на 1/4 пути через * путь *, только на 1/4 пути через * анимацию *. Поэтому с помощью функции времени «kCAMediaTimingFunctionEaseInEaseOut» и 0,25 для «repeatCount» анимация останавливается раньше, чем ожидалось. Кроме того, функция синхронизации будет по-прежнему применяться ко всей продолжительности анимации - и, следовательно, она будет ускоряться, а затем внезапно останавливаться, что может или не может быть тем, что хочет OP. – Hamish
@ originaluser2, вы правы. Я обнаружил, что анимация останавливается не совсем так, как я думал, что так будет, поэтому это объясняет! Благодаря! Я ищу 1/4 пути, а не анимацию. –