Swift: анимация по овальному пути Безье на 90 градусов по часовой стрелке - PullRequest
0 голосов
/ 09 октября 2018

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

  1. Вид размещается в центре верхней части экрана, но анимация начинается в точке 90 градусов (по часовой стрелке), выполняет все 360 градусов и затем возвращает вид в центр.Топ.Я хочу, чтобы это началось с центральной точки зрения.

  2. Я только хочу, чтобы представление перемещалось на 1/4 пути вокруг круга при каждой анимации.Таким образом, если он начинается при 0 градусах и перемещается до 90 при первом пролистывании, то при втором пролистывании он начинается с 90 и перемещается до 180 и так далее.

Вот мой код:

C_SelectionWrapper - пользовательский UIView:

@IBDesignable class C_SelectionWrapper: UIView {

var myOvalPath:UIBezierPath?

override func draw(_ rect: CGRect) {

    myOvalPath = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: rect.size.width, height: rect.size.width))

    UIColor.gray.setStroke()
    myOvalPath!.lineWidth = 5.0

    //add the dashes
    var dashes: [CGFloat] = [5, 25, 5, 25]
    myOvalPath!.setLineDash(&dashes, count: dashes.count, phase: 0)

    //voila!
    myOvalPath!.stroke()
}

}

в моем ViewController:

@IBOutlet weak var vSelectionWrapper: C_SelectionWrapper!
...

override func viewDidLoad() {
    super.viewDidLoad()

...

//add a swipe gesture
    let downSwipe = UISwipeGestureRecognizer(target: self, action: #selector(rotateButtons(_:)))
    downSwipe.direction = .down
    self.view.addGestureRecognizer(downSwipe)

}

@objc func rotateButtons(_ mySwipe:UISwipeGestureRecognizer) {

    if let thisPath = vSelectionWrapper.myOvalPath  {

        let kfAnimation = CAKeyframeAnimation(keyPath: "position")
        kfAnimation.path = thisPath.cgPath
        kfAnimation.rotationMode = CAAnimationRotationMode.rotateAuto
        kfAnimation.repeatCount = 0
        kfAnimation.duration = 2.5

        blueOval!.layer.add(kfAnimation, forKey: "animation")
    }

}

Вот оно в действии:

https://youtu.be/9F44tShWJ88

Любая помощь будет оценена.

...