Анимировать путь CAShapeLayer с помощью свойства transform.scale - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь анимировать масштаб CAShapeLayer, который имеет круговую дорожку (совместим с игровой площадкой):

import UIKit
import PlaygroundSupport

let view = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 200, height: 200)))
view.backgroundColor = .white

let animation = CABasicAnimation(keyPath: "transform.scale")
animation.duration = 1
animation.fromValue = 0
animation.toValue = 1
animation.autoreverses = true
animation.repeatCount = .greatestFiniteMagnitude

let frame = CGRect(origin: CGPoint(x: 40, y: 40), size: CGSize(width: 30, height: 30))
let path = CGPath(ellipseIn: frame, transform: nil)

let layer = CAShapeLayer()
layer.frame = frame
layer.path = path
layer.backgroundColor = UIColor.blue.cgColor
layer.fillColor = UIColor.red.cgColor

view.layer.addSublayer(layer)
layer.add(animation, forKey: nil)

PlaygroundPage.current.liveView = view

Вот результат:

enter image description here

Красный круг - это фигура, которую я пытаюсь оживить с помощью масштабной анимации прямо в центре своей позиции и без какого-либо перевода. Этот круг установлен от CGPath до CAShapeLayer.

Проблема очевидна - мой CAShapeLayer с синим цветом фона анимирует, как и ожидалось, но путь - нет.

Я что-то пропустил или это так работает? Может быть, эта анимация должна быть сделана по-другому?

1 Ответ

0 голосов
/ 05 ноября 2018

Если мое понимание верно, то вам нужны границы, а не рамки.

let frame = CGRect(origin: CGPoint(x: 40, y: 40), size: CGSize(width: 30, height: 30))

должно быть:

let bounds = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 30, height: 30))
let path = CGPath(ellipseIn: bounds, transform: nil)

Надеюсь, это то, что вам нужно.

...