我知道无论何时我们想要将一系列变换同时应用到某个点,我们必须指定与我们想要感知的方向相反的顺序。如果我想翻译( 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,
它们似乎正在将点转换为 TRx ,但这与文档相矛盾,并且当您将转换 TR 应用于{{{ 3}}这也与 xTR 的顺序一致。
为什么?关于转换如何在iOS中运行,我有什么遗漏?
答案 0 :(得分:0)
如果我没有弄错的话,你的困惑不在于操作顺序,而在于旋转转换。对象的中心不会发生旋转,而是围绕框架的原点进行旋转,框架的原点保持固定。旋转不在框架原点中心的物体时,它会像时钟指针的末端一样转动。要获得图像A,您必须
答案 1 :(得分:0)
很难看出这里的问题是什么,因为你已经回答了这个问题。基本上,调用concatenating
时必须使用的顺序与链接转换时使用的顺序相反。例如:
v2.transform =
CGAffineTransform(rotationAngle: 45 * .pi/180).translatedBy(x: 100, y: 0)
在此屏幕截图中,v2
为绿色视图,并从紫色视图所在的位置开始:
如果你想用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
}