Слои, геометрия и трансформации в Core Animation

Cocoa

Система координат слоя

Система координат для слоев различается в зависимости от текущей платформы. В IOS, в системе по умолчанию начало координат находится в левом верхнем углу слоя и положительные значения распространяются вниз и вправо от этой исходной точки. В Mac OS X, в системе по умолчанию начало координат находится в левом нижнем углу слоя и положительные значения распространяются вверх и вправо от этой точки. Все значения координат задаются в виде числа с плавающей точкой. И любые слои создаваемые на данной платформе используют систему координат по умолчанию, связанную с этой платформой.

Каждый слой объекта определяет и поддерживает свою собственную систему координат, и все содержимое слоя расположено по отношению к этой системе координат. Это верно как для содержимого слоя, так и любых подслоев. Поскольку каждый слой определяет свою собственную систему координат класс CALayer предоставляет методы для преобразования точки, прямоугольника и значения размера из системы координат одного слоя в другой.

Некоторые свойства слоя, связанные с определением их значения, используют единичную площадь координат. Единичная площадь координат - способ задания значения по сравнению с пределами слоя, но не связывая это свойство с точными значениями границ. Данные х и у координаты в пространстве координат блока всегда находятся в диапазоне от 0.0 до 1.0. Указание значения 0,0 вдоль оси х дает точку в левом краю слоя при задании значение 1.0 дает точку на правом краю слоя. (Для у, значение которого проходит вдоль верхнего края, а какие значения вдоль нижнего края зависит от используемой платформы и по тем же правилам, как описано выше). Точка с координатами (0.5, 0.5) дает точку точно в центре слоя.

Задание геометрии слоя

Хотя слои и дерево слоев , аналогичны видам и иерархии видов, во многом, геометрия слоя задается другим, и зачастую более простым, образом. Все геометрические свойства слоя, в том числе преобразование слоя матрицы, могут быть явно и неявно анимированными.

Cвойство position - структура CGPoint, которая определяет положение слоя по отношению к его superlayer, и выражается в системе координат superlayer.

Свойство bounds - структура CGRect которая обеспечивает размер слоя (bounds.size) и смещение (bounds.origin). Смещение границы используется как источник графического контекста, когда вы переопредиляете методы отрисовки слоя.

Слои имеют неявный frame, который является функцией от position, bounds, anchorPoint и transform свойств. Установка нового прямоугольника фрейма меняет свойства position и bounds слоя, соответствующим образом, но сам фрейм не сохраняется. Если новый прямоугольник фрейма определяется просто границами и смещением, то границы размера устанавливается в размере фрейма. Положение слоя устанавливается в нужное место по отношению к опорной точке. Когда вы получаете значение свойства фрейма, оно рассчитывается по отношению к свойствам position, bounds, и anchorPoint.

Свойство anchorPoint - структура CGPoint, которая определяет местоположение в пределах слоя, который соответствует позиции координат. Опорная точка (ancor point) определяет, как границы расположены по отношению к свойству position, а также выступающая в качестве того, что преобразования применяются во всем. Это выражается в устройстве системы координат, (0.0,0.0) значение находится ближе всего к началу слоя и (1.0,1.0) находится в противоположном углу. Применив преобразование родительского слоя (если он есть) может изменить anchorPoint ориентацию, в зависимости от системы координат родителя на оси ординат.

Когда вы задаете фрейм слоя, position задается относительно точки привязки. Когда вы указываете position слоя, bounds устанавливается по отношению к опорной точке.

IOS Замечание: Следующие примеры показывают, слои в Mac OS X, где в системе по умолчанию начало координат находится в левом нижнем углу. В iOS, начало слоя будет в верхнем левом углу и положительные значения будет распространяться вниз и вправо. Это приводит к изменению определенных значений, а не понятий.

На рисунке 2 показаны три примера значения опорной точки.

Рисунок 2 Три значения anchorPoint

ancor point

Значение по умолчанию anchorPoint является (0.5,0.5), которое соответствует центру границ слоя (показано в виде точки A на рисунке 2). Точка B показывает положение точки привязки со значением (0.0,0.5). Наконец, точка C (1.0,0.0) вызывает указывает, что положение этого слоя устанавливается в правом нижнем углу фрейма. Эта схема относится только к слоям, в Mac OS X. В IOS, слои используют отличную систему координат по умолчанию, где (0.0,0.0) находится в левом верхнем углу и (1.0,1.0) в правом нижнем углу.

Отношения свойств frame, bounds, position и anchorPoint показаны на рисунке 3.

Рисунок 3 слой со смещением (0.5,0.5)

ancor point default

В этом примере anchorPoint установлен в значение по умолчанию (0.5,0.5), что соответствует центру слоя. position слоя установлено в значение (100.0,100.0), и bounds устанавливается на прямоугольник (0.0, 0.0, 120,0, 80,0). Это приводит к фрейму свойств: рассчитанному как (40,0, 60,0, 120,0, 80,0).

Если вы создаете новый слой, и устанавливаете только свойства фрейма в (40.0, 60.0, 120.0, 80.0), свойство position будет автоматически установлено в (100.0,100.0), и свойство bounds в (0.0, 0.0, 120.0, 80.0).

На рисунке 4 показан слой с тем же прямоугольником фрейма, как слой на рисунке 3. Тем не менее, в этом случае anchorPoint слоя установлен в (0.0,0.0), что соответствует нижнему левому углу слоя.

Рисунок 4 слой со смещением (0.0,0.0)

ancor point 0 0

В фрейме со значением (40,0, 60,0, 120,0, 80,0), значение свойства bounds то же самое, но значение свойства position изменилось.

Другой аспект геометрии слоев, который отличается от cocoa видов, можно указать радиус, который используется для закругления углов слоя. Свойство cornerRadius определяет радиус слоя используется при разработке содержания, обрезании подслоев, и проведении границы и тени.

Cвойство zPosition определяет позицию слоя по компоненте оси z. zPosition может быть использовано для установки визуального положения слоя по отношению к родственным слоям. Оно не должно использоваться, для определения порядка родственного слоя, вместо того, чтобы изменить порядок слоев в массиве подслоев.

Преобразование геометрии слоя

После создания, вы можете преобразовать геометрию слоя с помощью матричных преобразований. В CATransform3D структуре данных определяется однородное трехмерное преобразование (матрица 4 на 4 со значениями CGFloat), которая используется для поворота, масштабирования, смещения, наклона и применения преобразований перспективы слоя.

Два свойства слоя указывают матрицу преобразования: transform и sublayerTransform. Матрица, заданная свойством transform применяется к слою и его подслоев относительно anchorPoint слоя. Рисунок 3 показывает, как преобразования вращение и масштабирование влияют на уровень при использовании anchorPoint co значением (0.5,0.5), по умолчанию. На рисунке 4 показано, как те же матрицы преобразования влияют на уровень, когда anchorPoint c (0.0,0.0). Матрица, заданная свойством sublayerTransform применяется только к подслоям слоя, а не самому слою.

Вы можете создать и изменить CATransform3D структуру данных одним из следующих способов:

  • используя CATransform3D функцию
  • измененяя непосредственно элементы структуры данных
  • используя кодирование ключ-значение, и ключевые пути.

Постоянная CATransform3DIdentity - единичная матрица, матрица, которая не имеет масштаб, поворот, наклон, или перспективу применения. Применяя тождество матрицы слой будет отображен с геометрией по умолчанию.

Функции преобразований

Функции преобразований, доступные в Core Animation работают с матрицами. Вы можете использовать эти функции (как показано в Таблице 1) для построения матрицы, которую позже примените к слою или подслою путем изменения или преобразования свойства sublayerTransform соответственно. Функция преобразования либо работает дальше, или возвращает, CATransform3D структуру данных. Это позволяет строить простые или сложные преобразования, которые можно легко использовать повторно.

Таблица 1 CATransform3D функции преобразований для переноса, вращения и масштабирования

ФункцияИспользует
CATransform3DMakeTranslationВозвращает преобразование, которое переносит на '(tx, ty, tz)'. t' = [1 0 0 0; 0 1 0 0; 0 0 1 0; tx ty tz 1].
CATransform3DTranslateПереносит 't' на '(tx, ty, tz)' и возвращает * t' = translate(tx, ty, tz) * t.
CATransform3DMakeScaleВозвращает преобразование, которое масштабирует `(sx, sy, sz)': * t' = [sx 0 0 0; 0 sy 0 0; 0 0 sz 0; 0 0 0 1].
CATransform3DScaleМасштабирует 't' до '(sx, sy, sz)' и возвращает * t' = scale(sx, sy, sz) * t.
CATransform3DMakeRotationВозвращает преобразование, которое поворачивается на 'angle' в радианах вокруг вектора '(x, y, z)'. Если вектор имеет длину нуль возвращается тождество преобразования.
CATransform3DRotateПоворачивает 't' на 'angle' в радианах вокруг вектора '(x, y, z)' и возвращает t' = rotation(angle, x, y, z) * t.

Угол поворота задается в радианах, а не градусах. Следующие функции позволяют конвертировать между радианами и градусами.

CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;};
CGFloat RadiansToDegrees(CGFloat radians) {return radians * 180 / M_PI;};

Core Animation обеспечивает функции преобразования которые инвертируют матрицы, CATransform3DInvert. Инверсия, как правило, используется для обеспечения обратного преобразования точек в трансформированных объектах. Инверсия может быть полезна, когда необходимо восстановить значение, которое было преобразовано матрицей: инвертирование матрицы, и умножение этого значениея на обратную матрицу, в результате дает первоначальное значение.

Функции также позволяют вам конвертировать CATransform3D матрицы в CGAffineTransform матрицы, при условии, что матрица CATransform3D может быть выражена как CGAffineTransform.

Таблица 2 CATransform3D функции преобразования для преобразования CGAffineTransform

ФункцияИспользует
CATransform3DMakeAffineTransformВозвращает CATransform3D с тем же эффектом, как аффинное преобразование.
CATransform3DIsAffineВозвращает YES если прошедшее CATransform3D можно точно представить аффинным преобразованием.
CATransform3DGetAffineTransformВозвращает аффинное преобразование, представляемое прошедшим CATransform3D.

Функции предназначенные для сравнения матриц преобразования на равенство с единичной или другой матрицей преобразования.

Таблица 3 CATransform3D функции преобразования для проверки равенства

ФункцияИспользует
CATransform3DIsIdentityВозвращает значение YES, если преобразование тождественное преобразование.
CATransform3DEqualToTransformВозвращает значение YES, если два преобразования в точности равны ..

Изменение структуры данных преобразований

Вы можете изменить значение любого элемента из CATransform3D структуры данных элементов, как и любой другой структуры данных. Листинг 1 содержит определение CATransform3D структуры данных, элементы структуры приведены в соответствующих позициях матрицы.

Листинг 1 CATransform3D структура

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;

Изменение преобразования с использованием ключевых путей

Core Animation расширяет ключ-значение протокола кодирования, чтобы полученить и установить общие значения CATransform3D матрицы слоя с помощью ключевых путей. Таблица 4 описывает основные ключи пути, для transform и sublayerTransform слоев свойства ключ-значение кодирования и соблюдения требованиям.

Таблица 4 CATransform3D ключи пути

ФункцияИспользует
rotation.xВращения в радианах, по оси х.
rotation.yВращения в радианах, по оси у.
rotation.zВращения в радианах, по оси z.
rotationВращения в радианах, по оси z. Это равнозначно установке rotation.z.
scale.xКоэффициент масштабирования для оси х.
scale.yКоэффициент масштабирования для оси у.
scale.zКоэффициент масштабирования для оси z.
scaleСреднее всех трех факторов масштабирования.
translation.xПереместить по оси х.
translation.yПереместить по оси у.
translation.zПереместить по оси z.
translationПереместить по оси х и у. Значение NSSize или CGSize.

Вы не можете указывать путь к ключю структуры поля с помощью Objective-C 2.0 свойства. Следующий код не будет работать:

myLayer.transform.rotation.x=0;

Вместо этого вы должны использовать setValue:forKeyPath: или valueForKeyPath: как показано ниже:

[myLayer setValue:[NSNumber numberWithInt:0] forKeyPath:@"transform.rotation.x"];
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac