2014-12-24 3 views
0

Есть ли способ достичь того, что имеет свойство анимации, начиная анимацию в определенный момент времени, но без «обертывания» поведения?Запуск анимации при заданном смещении

У меня есть две анимации (в двух разных слоях):

// This is the animation of the stroke of a circle 
let progressAnim = CABasicAnimation(keyPath: "strokeEnd") 
progressAnim.duration = duration 
progressAnim.fromValue = 0 
progressAnim.toValue = 1 
progressAnim.fillMode = kCAFillModeBackwards 
progressAnim.timeOffset = elapsed 

// This is the animation of a pointer that follow the same circle as above 
let arrowAnim = CAKeyframeAnimation(keyPath: "position") 
arrowAnim.duration = duration 
arrowAnim.rotationMode = kCAAnimationRotateAuto 
arrowAnim.path = arrowPath.CGPath 
arrowAnim.fillMode = kCAFillModeBackwards 
arrowAnim.timeOffset = elapsed 

Это запускает анимацию на разыскиваемого прогресса, но, когда он достигает того, что, как предполагается, в конце концов, он начинает снова и продолжается в течение оставшаяся продолжительность. Я понимаю, что это так, как указано timeOffset, но я надеялся, что можно как-то добиться того же без обертки.

ответ

1

Я думаю, что я понял это. Методом проб и ошибок, это, кажется, работает, когда я установил beginTime анимации в то время, в прошлом, как это:

let beginTime = CACurrentMediaTime() - offset 
// Set the beginTime of the progress animation 
progressAnim.beginTime = beginTime 
// Set the begintTime of the arrow animation 
arrowAnim.beginTime = beginTime 

Это, кажется, желаемого эффекта.

0

Вместо timeOffset взломать, вы можете рассчитать правильный fromValue и соответствующий duration.

например.

progressAnim.duration = duration - elapsed 
progressAnim.fromValue = elapsed/duration 
+0

Вот что я пробовал в первую очередь, но две анимации не синхронизируются, когда я вычисляю 'strokeEnd' для круга и' startAngle' для анимации стрелок. Они начинаются и заканчиваются в одно и то же время, но между ними поведение несколько ... buggy ... – NilsH

+0

Это тоже не сработает. –

2

Да, это возможно. Вам нужно будет использовать те же настройки, которые вы используете для приостановки и возобновления анимации «в полете». Документация довольно слабая, и свойства анимации сбивают с толку как ад. Каждый раз, когда мне приходится работать с паузой и возобновлением анимации, мне приходится тратить, как полдня, на то, чтобы понять это снова, а потом через неделю я забыл, как это сделать снова. Прошло не менее 6 месяцев с тех пор, как я справился с этим, поэтому я действительно забыл, как это сделать.

У меня есть демонстрационный проект на github, который показывает, как приостановить и возобновить анимацию, и даже использовать слайдер для перемещения анимации вперед и назад. Я предлагаю вам взглянуть на это. В нем есть все части, нужно:

Keyframe view animation demo on Github

Смежные вопросы