Как мне растянуть CALayer, сохраняя при этом целостное происхождение? - PullRequest
4 голосов
/ 17 марта 2011

Я пытаюсь растянуть UIView, который у меня есть, применяя к нему CATransform3DMakeScale:

CATransform3DMakeScale(0.9, 1.0 - (0.1 * (path.row - midPath.row)), 1)

Проблема с этим в два раза: он оставляет меня с дробными рамками / границами, которые я не могу округлить или выровнять, и он вытягивает начало моего кадра так, что его точка начала y больше не равна 0.

Можно ли растянуть слой только в одном направлении? Другими словами, держите начало координат x и y фиксированным и вытяните либо к этому началу, либо от него.

Кроме того, есть ли где-нибудь документация о влиянии различных переменных mxx в CATransform3D? Я огляделся и не смог найти ни одного, а проб и ошибок дошло только до меня.

1 Ответ

2 голосов
/ 17 марта 2011

Если вы хотите сохранить фиксированный источник при растяжении 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, и применить ее здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...