Создать анимацию вращения для UIBezierPath

У меня есть CAShapeLayer, который представляет собой круг с центром в середине основного представления моего контроллера представления.

Это выглядит так:

Создать анимацию вращения для UIBezierPath

У меня проблема в том, что если я попытаюсь анимировать вращение с помощью следующего кода, он вращается не вокруг центра круга, а где-то еще.

import UIKit

extension UIView {
    func addCircle(centerOfCircle: CGPoint, radius: CGFloat, startAngle: CGFloat?, endAngle: CGFloat?) {
        let circlePath = UIBezierPath(arcCenter: centerOfCircle, radius: radius, startAngle: startAngle ?? 0, endAngle: endAngle ?? CGFloat(Double.pi * 2), clockwise: true)

        let shapeLayer = CAShapeLayer()
        shapeLayer.path = circlePath.cgPath

        //change the fill color
        shapeLayer.fillColor = UIColor.clear.cgColor
        //you can change the stroke color
        shapeLayer.strokeColor = UIColor.red.cgColor

        shapeLayer.lineDashPattern = [1, 10]
        shapeLayer.lineCap = .round
        //you can change the line width
        shapeLayer.lineWidth = 3.0

        shapeLayer.anchorPoint = centerOfCircle

        let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
        rotation.toValue = NSNumber(value: Double.pi * 2)
        rotation.duration = 2
        rotation.isCumulative = true
        rotation.repeatCount = Float.greatestFiniteMagnitude



        shapeLayer.add(rotation, forKey: "rotationAnimation")

        self.layer.addSublayer(shapeLayer)
    }
}

То, что я получаю, это следующее:

Создать анимацию вращения для UIBezierPath

Любая помощь будет высоко ценится!

вам нужно установить точку привязки, stackoverflow.com/questions/26815263/…

Teja Nandamuri 29.05.2019 16:35

Я сделал это @TejaNandamuri - посмотри мой код

linus_hologram 29.05.2019 16:36

Он установлен в центре UIBezierPath. Должен ли я установить его в другом месте?

linus_hologram 29.05.2019 16:37

каково значение centerOfCircle?

Teja Nandamuri 29.05.2019 16:37

Это центр UIView, поэтому вид основного экрана: self.view.addCircle(centerOfCircle: CGPoint(x: self.view.frame.width/2, y: self.view.frame.height/2), радиус : self.view.frame.width / 1.5, startAngle: ноль, endAngle: ноль)

linus_hologram 29.05.2019 16:38

точка привязки должна быть (0.5,0.5) для центра

Teja Nandamuri 29.05.2019 16:38

не давайте ему центр просмотра, просто установите ему CGPoint(o.5,0.5)

Teja Nandamuri 29.05.2019 16:38

shapeLayer.anchorPoint = CGPoint(x: 0.5, y: 0.5) тоже не работает

linus_hologram 29.05.2019 16:39

@TejaNandamuri Давайте продолжить обсуждение в чате.

linus_hologram 29.05.2019 16:45

может быть, это пи / 2?

Julian Silvestri 29.05.2019 17:12

@JulianSilvestri нет, нет ... возможно ли вообще анимировать UIBezierPath, чтобы он вращался вокруг его центра, или мне нужно делать это с родительским представлением?

linus_hologram 29.05.2019 17:14

невозможно анимировать путь Безье, так как это просто путь, по которому следует объект. Вы должны анимировать родительский вид

Julian Silvestri 29.05.2019 17:15

@JulianSilvestri спасибо за помощь, это все, что я хотел знать

linus_hologram 29.05.2019 17:18

нет проблем. Вы можете создать иллюзию вращения, создав круговой путь Безье, по которому следует объект.

Julian Silvestri 29.05.2019 17:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
14
644
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо того, чтобы анимировать вращение, анимируйте свойство линияDashPhase элемента CAShapeLayer.

extension UIView {
    func addDashedCircle() {
        let circleLayer = CAShapeLayer()
        circleLayer.path = UIBezierPath(arcCenter: CGPoint(x: frame.size.width/2, y: frame.size.height/2),
                                        radius: frame.size.width/2,
                                        startAngle: 0,
                                        endAngle: .pi * 2,
                                        clockwise: true).cgPath
        circleLayer.lineWidth = 3.0
        circleLayer.strokeColor =  UIColor.red.cgColor
        circleLayer.fillColor = UIColor.white.cgColor
        circleLayer.lineJoin = .round
        circleLayer.lineDashPattern = [1,10]

        let animation = CABasicAnimation(keyPath: "lineDashPhase")
        animation.fromValue = 0
        animation.toValue = -11//1+10
        animation.duration = 1
        animation.repeatCount = .infinity
        circleLayer.add(animation, forKey: "line")

        layer.addSublayer(circleLayer)
    }
}

Другие вопросы по теме