CGAffineTransform连接:适当的转换顺序

时间:2018-04-18 22:37:10

标签: ios swift cgaffinetransform

我知道无论何时我们想要将一系列变换同时应用到某个点,我们必须指定与我们想要感知的方向相反的顺序。如果我想翻译( T )然后旋转( R )点 x ,我们需要以串联矩阵结束 RT ,然后每个点都转换为(RT)x

Apple Transform文档显示CGAffineTransform可用作上述表达式的转置版本。也就是说,不是将 Ax 转换为 A 作为任何转换矩阵,而是 x B A 的转置。

同样CGAffineTransform.concatenating(T2)文档说明它的堆栈转换到右边,以 T1 * T2 的形式转换为矩形的转换矩阵。

现在我的担忧是什么?如果想要进行translate T )然后rotate R )的一系列转换,我可以调用T.concatenating(R)哪个结果在转换 TR 中,然后将点转换为 xTR ,似乎必须遵守订单,但实际上我得到了错误的结果(至少那是我的想法),我期待图像A但是得到B,

enter image description here

它们似乎正在将点转换为 TRx ,但这与文档相矛盾,并且当您将转换 TR 应用于{{{ 3}}这也与 xTR 的顺序一致。

为什么?关于转换如何在iOS中运行,我有什么遗漏?

3 个答案:

答案 0 :(得分:0)

如果我没有弄错的话,你的困惑不在于操作顺序,而在于旋转转换。对象的中心不会发生旋转,而是围绕框架的原点进行旋转,框架的原点保持固定。旋转不在框架原点中心的物体时,它会像时钟指针的末端一样转动。要获得图像A,您必须

  1. 翻译您的物体,使您想要旋转的点(可能是它的中心)位于原点。
  2. 旋转对象。
  3. 将其翻译到所需位置。

答案 1 :(得分:0)

很难看出这里的问题是什么,因为你已经回答了这个问题。基本上,调用concatenating时必须使用的顺序与链接转换时使用的顺序相反。例如:

v2.transform = 
     CGAffineTransform(rotationAngle: 45 * .pi/180).translatedBy(x: 100, y: 0)

在此屏幕截图中,v2为绿色视图,并从紫色视图所在的位置开始:

enter image description here

如果你想用concatenating做到这一点,你会说:

let r = CGAffineTransform(rotationAngle: 45 * .pi/180)
let t = CGAffineTransform(translationX:100, y:0)
v2.transform = t.concatenating(r) // not r.concatenating(t)

答案 2 :(得分:-1)

    let rotationAngle           = CGFloat.pi / 4
    let slidingLength : CGFloat = 50
    let duration                = 0.3
    UIView.animate(withDuration: duration) { [weak self] in
        self?.slidingView.transform = CGAffineTransform(rotationAngle: rotationAngle)
        self?.slidingView.center.x += slidingLength
    }