У меня возникли проблемы, чтобы понять, почему анимация не работает, как ожидалось. То, что я делаю это:CAKeyFrameAnimation не Linear для значений больше, чем PI
Создать
UIBezierPath
с дугой, чтобы переместить метку по этому пути и живой ход трактов.//Start Point is -.pi /2 to let the Arc start at the top. //self.progress = Value between 0.0 and 1.0 let path : UIBezierPath = UIBezierPath.init(arcCenter: CGPoint.init(x: self.bounds.width * 0.5, y: self.bounds.height * 0.5), radius: self.bounds.width * 0.5, startAngle: -.pi/2, endAngle: (2 * self.progress * .pi) - (.pi/2), clockwise: true) return path
Добавить этот путь к
CAShapeLayer
circlePathLayer.frame = bounds circlePathLayer.path = self.path.cgPath circlePathLayer.strokeStart = 0 circlePathLayer.strokeEnd = 1
анимировать свойство strokeEnd с
CABasicAnimation
let animation = CABasicAnimation(keyPath: "strokeEnd") animation.repeatCount = HUGE animation.fromValue = 0.0 animation.toValue = 1.0 animation.duration = self.animationDuration animation.isRemovedOnCompletion = false animation.fillMode = kCAFillModeBoth
анимировать положение свойство моего лейбла с
CAKeyFrameAnimation
let animationScore = CAKeyframeAnimation(keyPath: "position") //some things I tried to fix //animationScore.timingFunctions = [CAMediaTimingFunction(controlPoints: 0.250, 0.250, 0.750, 0.750)] //animationScore.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionLinear) animationScore.path = self.path.cgPath animationScore.duration = self.animationDuration animationScore.isRemovedOnCompletion = false animationScore.fillMode = kCAFillModeBoth animationScore.repeatCount = HUGE
Добавить мои анимации к слою и маркировать
self.circlePathLayer.add(animation, forKey: nil) self.scoreLabel.layer.add(animationScore, forKey: nil)
Моя проблема: Для ProgressValues больше, чем 0,75 моей этикетке не движется в линейной скорости. Значения, превышающие 0,75, означают, что моя дуга больше, чем PI. Для значений, меньших 0,75, моя анимация работает нормально, а метка и обводка имеют одинаковую скорость и находятся на вершине друг друга.
Игнорируйте 100% в ярлыке в этом формате GIF мой прогресс был на значении 0,76.
Вы видите, что моя метка замедляется после трех четвертей моего круга.
Я надеюсь, что кто-то может мне помочь. Большое спасибо
Вы отправите демо? Если вы не возражаете? Я проверю его и вернусь к вам с решением –
Я не вижу, как вы устанавливаете 'расчетMode'. Но в любом случае ... Почему вы вообще используете анимацию ключевого кадра? Просто поверните этикетку вокруг центра круга как опорную точку, как планета. Подумайте о часовой стрелке (помните часы руками?). Разумеется, вам понадобится вторая ротация вокруг центра ярлыков, чтобы сохранить его в вертикальном положении. – matt
Спасибо вам за ваши ответы. @matt установка 'calculateMode' ничего не меняла. Но поворот моего ярлыка вокруг anchorPoint, кажется, стоит попробовать. Как мне это сделать? Это просто «CABasicAnimation transform.rotation»? И мне нужно создать «CAAnimationGroup», чтобы объединить обе анимации, не так ли? –