【发布时间】:2014-09-09 07:20:44
【问题描述】:
我想获得 scale 因子和 rotation 角度形式的视图。我已经将CGAffineTransform 应用于该视图。
【问题讨论】:
标签: ios iphone animation rotation scale
我想获得 scale 因子和 rotation 角度形式的视图。我已经将CGAffineTransform 应用于该视图。
【问题讨论】:
标签: ios iphone animation rotation scale
UIView 的当前转换存储在其transform 属性中。这是一个CGAffineTransform 结构,您可以在此处阅读更多信息:https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGAffineTransform/Reference/reference.html
您可以像这样从变换中获得以弧度为单位的角度:
CGFloat angle = atan2f(yourView.transform.b, yourView.transform.a);
如果你想要以度为单位的角度,你需要像这样转换它:
angle = angle * (180 / M_PI);
得到这样的比例:
CGFloat scaleX = view.transform.a;
CGFloat scaleY = view.transform.d;
【讨论】:
在 Swift 3 中:
let rotation = atan2(view.transform.b, view.transform.a)
【讨论】:
atan2 提供重载,采用 CGFloat、Double 或 Float。
let rotation = atan2(view.transform.b, view.transform.a) 工作!
我遇到了同样的问题,找到了这个解决方案,但它只是部分解决了我的问题。 事实上,从变换中提取比例的建议解决方案:
(所有代码都在 swift 中)
scaleX = view.transform.a
scaleY = view.transform.d
仅在旋转为 0 时有效。
当旋转不是0 时,transform.a 和transform.d 会受到旋转的影响。要获得正确的值,您可以使用
scaleX = sqrt(pow(transform.a, 2) + pow(transform.c, 2))
scaleY = sqrt(pow(transform.b, 2) + pow(transform.d, 2))
注意,结果总是积极的。如果您还对缩放的符号感兴趣(视图被翻转),那么缩放的符号是 x 翻转的 transform.a 和 y 翻转的 transform.d 的符号。一种继承标志的方法。
scaleX = (transform.a/abs(transform.a)) * sqrt(pow(transform.a, 2) + pow(transform.c, 2))
scaleY = (transform.d/abs(transform.d)) * sqrt(pow(transform.b, 2) + pow(transform.d, 2))
【讨论】: