Если вы хотите сохранить фиксированный источник при растяжении CALayer, вы можете изменить его свойство anchorPoint
следующим образом:
layer.anchorPoint = CGPointMake(0.0f, 0.0f);
anchorPoint
определяет точку, относительно которой преобразования применяются к вашему слою. Он также привязан к свойству position
вашего слоя, поэтому, если вы отрегулируете anchorPoint
, вам может понадобиться изменить положение вашего слоя впоследствии.
Установив опорную точку, вы сможете установить слой в качестве целочисленной исходной координаты и растянуть его при преобразовании. Однако вы не будете поддерживать целую ширину и высоту.
Что касается элементов m12
и т. Д. В CATransform3D, эта структура имеет матрицу 4 x 4:
struct CATransform3D
{
CGFloat m11, m12, m13, m14;
CGFloat m21, m22, m23, m24;
CGFloat m31, m32, m33, m34;
CGFloat m41, m42, m43, m44;
};
typedef struct CATransform3D CATransform3D;
где каждое значение представляет одно место в матрице. Эта матрица основана на трехмерных матрицах OpenGL, таких как матрица вида модели. Базовая анимация предоставляет вспомогательные функции для выполнения большинства манипуляций с этой матрицей, которые вам понадобятся, но время от времени вы будете устанавливать один из элементов матрицы (например, m34
для эффекта перспективы).
Я никогда не был хорош в математической математике, но вы можете найти любую рецензию, которую люди собрали для математики, стоящей за матрицами представления модели OpenGL, и применить ее здесь.