CAShapeLayer получить текущий масштаб - PullRequest
0 голосов
/ 26 июня 2018

У меня есть CAShapeLayer, который масштабируется до неизвестного номера шкалы:

myCAShapeLayer.transform = CATransform3DMakeScale(newScale, newScale, 1)

Затем в определенный момент я должен запустить CABasicAnimation от текущего масштаба до 1:

let animation1 = CABasicAnimation(keyPath: "transform.scale")
animation1.fromValue = myCAShapeLayer.value(forKeyPath: "transform.scale") as! CGFloat
animation1.toValue = 1.0
animation1.duration = 0.5
myCAShapeLayer.add(animation1, forKey: nil)

когда я регистрирую myCAShapeLayer.value(forKeyPath: "transform.scale") as! CGFloat после каждого CATransform3DMakeScale, оно всегда равно 1,0, хотя визуально слой масштабируется.

Я также пытался myCAShapeLayer.presentation()?.value(forKeyPath: "transform.scale") as! CGFloat, а также 1,0

1 Ответ

0 голосов
/ 26 июня 2018

Если перейти к объявлению CATransform3DMakeScale.У нас есть эта информация

/* Returns a transform that scales by `(sx, sy, sz)':
 * t' = [sx 0 0 0; 0 sy 0 0; 0 0 sz 0; 0 0 0 1]. */
@available(iOS 2.0, *)
public func CATransform3DMakeScale(_ sx: CGFloat, _ sy: CGFloat, _ sz: CGFloat) -> CATransform3D

Итак, поскольку мы знаем, что indices в матрице изменено для этого transform, мы можем получить каждый, как показано ниже,

shape.transform = CATransform3DMakeScale(2.09, 4.88, 3.49)
print(shape.transform.m11)
print(shape.transform.m22)
print(shape.transform.m33)

Вывод:

2.09
4.88
3.49
...