【问题标题】:Get scale and rotation angle from CGAffineTransform?从 CGAffineTransform 获取缩放和旋转角度?
【发布时间】:2014-09-09 07:20:44
【问题描述】:

我想获得 scale 因子和 rotation 角度形式的视图。我已经将CGAffineTransform 应用于该视图。

【问题讨论】:

    标签: ios iphone animation rotation scale


    【解决方案1】:

    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;
    

    【讨论】:

    • 我想知道为什么 CGAffineTransform 类没有这类东西的属性?
    【解决方案2】:

    在 Swift 3 中:

    let rotation = atan2(view.transform.b, view.transform.a)

    【讨论】:

    • 您不需要转换参数类型 — 标准库为 atan2 提供重载,采用 CGFloatDoubleFloat
    • 我收到一个错误:“无法将 'CGFloat' 类型的值转换为预期的参数类型 'Float'”
    • let rotation = atan2(view.transform.b, view.transform.a) 工作!
    【解决方案3】:

    我遇到了同样的问题,找到了这个解决方案,但它只是部分解决了我的问题。 事实上,从变换中提取比例的建议解决方案:

    (所有代码都在 swift 中)

    scaleX = view.transform.a
    scaleY = view.transform.d
    

    仅在旋转为 0 时有效。

    当旋转不是0 时,transform.atransform.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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多