CGAffineTransformは、逆順に適用される。
例えば、アンカーを指定して拡縮する処理をきちんと考えてみた。
アンカーを指定して拡縮するCGAffineTransformは以下で作れる。
CGAffineTransformMakeWithAnchor
var transform = CGAffineTransformMakeTranslation(anchor.x, anchor.y) //1: anchor分移動
transform = CGAffineTransformScale(transform, scaleWidth, scaleHeight) //2: 拡縮
transform = CGAffineTransformTranslate(transform, -anchor.x, -anchor.y) //3: anchorの逆分移動
追っていくと、3→2→1の順で実行しないと正しくアンカーを指定して拡縮にならないことが分かる。
結果を見てみると、行列としても以下の様な3→2→1の順でかけたものができている。
何か理由がありそうだけど、分からない。