В первой попытке вы пытаетесь анимировать путь большого пальца (контур красного круга).Во второй попытке вы пытаетесь анимировать position
из thumbLayer
(но вы анимировали неверные ключевые пути).
Поскольку у вас возникают трудности с выполнением любой из этих работ, давайте попробуемдругой подход.Взгляните на стандартные Швейцарские железнодорожные часы :
В частности, посмотрите на красную точку в конце второгорука.Как часы перемещают эту красную точку вокруг лица?Вращая секундную стрелку вокруг центра лица.
Это то, что мы собираемся сделать, но мы не будем рисовать всю секундную стрелку.Мы просто нарисуем красную точку в конце.
Мы поместим начало координатной системы thumbLayer
в центр круговой дорожки, и мы установим ее путь так, чтобыбольшой палец появляется на пути.Вот макет:
Вот код для установки circleLayer
и thumbLayer
:
private let circleLayer = CAShapeLayer()
private let thumbLayer = CAShapeLayer()
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let circleRadius: CGFloat = 100
let thumbRadius: CGFloat = 22
let circleCenter = CGPoint(x: view.bounds.midX, y: view.bounds.midY)
circleLayer.fillColor = nil
circleLayer.strokeColor = UIColor.black.cgColor
circleLayer.lineWidth = 4
circleLayer.lineJoin = .round
circleLayer.path = CGPath(ellipseIn: CGRect(x: -circleRadius, y: -circleRadius, width: 2 * circleRadius, height: 2 * circleRadius), transform: nil)
circleLayer.position = circleCenter
view.layer.addSublayer(circleLayer)
thumbLayer.fillColor = UIColor.red.cgColor
thumbLayer.strokeColor = nil
thumbLayer.path = CGPath(ellipseIn: CGRect(x: -thumbRadius, y: -circleRadius - thumbRadius, width: 2 * thumbRadius, height: 2 * thumbRadius), transform: nil)
thumbLayer.position = circleCenter
view.layer.addSublayer(thumbLayer)
}
СПри такой компоновке мы можем перемещать большой палец вдоль дорожки, не меняя ее положения.Вместо этого мы вращаем thumbLayer
вокруг его источника:
@IBAction func buttonWasTapped() {
let animation = CABasicAnimation(keyPath: "transform.rotation")
animation.fromValue = 0
animation.toValue = 2 * CGFloat.pi
animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
animation.duration = 1.5
animation.isAdditive = true
thumbLayer.add(animation, forKey: nil)
}
Результат: