Xcode Swift, анимация ключевых кадров имеет нежелательную задержку между циклами анимации на кривой Безье

#swift #xcode #animation

#swift #xcode #Анимация

Вопрос:

Я пытаюсь анимировать UIView вдоль овала, используя кривую Безье. Код работает, за исключением того, что между каждым циклом анимации есть задержка. Я в недоумении относительно того, что является причиной этого.

 let myView = UIView()
myView.backgroundColor = UIColor.blue
myView.frame = CGRect(x: 0, y:0, width: 30, height: 30)
        
let path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 200, height: 200))
        
let animation = CAKeyframeAnimation(keyPath: "position")
animation.path = path.cgPath
animation.repeatCount = 1000
animation.duration = 1
        
myView.layer.add(animation, forKey: "animate along path")
 

Ответ №1:

Найдено решение. Пауза между циклами анимации происходит только при создании пути с помощью конструктора UIBezierPath(ovalIn:). При создании собственного пути вручную задержки нет. Итак, я сделал свой собственный овал.

Заменил это

 let path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 200, height: 200))
 

с помощью этого

 let rect = CGRect(x: 0, y: 0, width: 200, height: 200)
        
let path = UIBezierPath()
        
path.move(to: CGPoint(x: rect.maxX, y: rect.midY))
path.addQuadCurve(to: CGPoint(x: rect.midX, y: rect.maxY), controlPoint: CGPoint(x: rect.maxX, y: rect.maxY))
path.addQuadCurve(to: CGPoint(x: rect.minX, y: rect.midY), controlPoint: CGPoint(x: rect.minX, y: rect.maxY))
path.addQuadCurve(to: CGPoint(x: rect.midX, y: rect.minY), controlPoint: CGPoint(x: rect.minX, y: rect.minY))
path.addQuadCurve(to: CGPoint(x: rect.maxX, y: rect.midY), controlPoint: CGPoint(x: rect.maxX, y: rect.minY))