Это совпадение, что умножение и сложение матрицы масштабирования и матрицы перевода имеют одинаковый результат.
В общем случае scaledBy
и translatedBy
не означают сложение,они являются сокращением для объединения двух преобразований, что является умножением матрицы.Умножение матриц является коммутативным только для диагональных матриц (матриц, которые имеют ненулевые значения в диагональной линии), поэтому S * T
обычно не совпадает с T * S
.
. Искать $(xcrun --show-sdk-path)/System/Library/Frameworks/CoreGraphics.framework/Headers/CGAffineTransform.h
длячто делает каждая функция:
CGAffineTransformTranslate
: t '= [1 0 0 1 tx ty] * t CGAffineTransformScale
: t' = [sx 0 0 sy 00] * t CGAffineTransformRotate
: t '= [cos (угол) sin (угол) -in (угол) cos (угол) 0 0] * t CGAffineTransformConcat
:t '= t1 * t2
Это означает, что когда вы используете CGAffineTransformConcat
, t1
должно быть преобразованием, которое вы применяете, и t2
должно быть матрицей, которую вы преобразовываете,Другими словами, scale.translatedBy
эквивалентно concat(translation, scale)
, а не concat(scale, translation)
.При использовании concatenate
в качестве метода это заставляет операцию смотреть назад из-за ее математического определения.