У меня есть CAShapeLayer, который представляет собой круг с центром в середине основного представления моего контроллера представления.
Это выглядит так:
У меня проблема в том, что если я попытаюсь анимировать вращение с помощью следующего кода, он вращается не вокруг центра круга, а где-то еще.
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)
}
}
То, что я получаю, это следующее:
Любая помощь будет высоко ценится!
Я сделал это @TejaNandamuri - посмотри мой код
Он установлен в центре UIBezierPath. Должен ли я установить его в другом месте?
каково значение centerOfCircle?
Это центр 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: ноль)
точка привязки должна быть (0.5,0.5) для центра
не давайте ему центр просмотра, просто установите ему CGPoint(o.5,0.5)
shapeLayer.anchorPoint = CGPoint(x: 0.5, y: 0.5) тоже не работает
@TejaNandamuri Давайте продолжить обсуждение в чате.
может быть, это пи / 2?
@JulianSilvestri нет, нет ... возможно ли вообще анимировать UIBezierPath, чтобы он вращался вокруг его центра, или мне нужно делать это с родительским представлением?
невозможно анимировать путь Безье, так как это просто путь, по которому следует объект. Вы должны анимировать родительский вид
@JulianSilvestri спасибо за помощь, это все, что я хотел знать
нет проблем. Вы можете создать иллюзию вращения, создав круговой путь Безье, по которому следует объект.
Вместо того, чтобы анимировать вращение, анимируйте свойство линия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)
}
}
вам нужно установить точку привязки, stackoverflow.com/questions/26815263/…