Иерархия дерева слоев Core Animation

Cocoa

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

Иерархия дерева слоев Core Animation является эквивалентом иерархии видов Cocoa. Так же, как экземпляр NSView или UIView имеет superview и subview, слой Core Animation имеет superlayer и sublayer. Дерево cлоев предоставляет многие из тех же преимуществ, что и иерархия видов:

  • Комплекс интерфейсов может быть собран с помощью более простых слоев, избегая сложных монолитных подклассов. Слои хорошо подходят для этого типа "укладки" в связи с их комплексными возможностями композитинга.
  • Каждый слой заявляет о своей собственной системе координат относительно системы координат его superlayer. Когда слой трансформируется, его подслои преобразуются в его пределах.
  • Дерево слоев является динамическим. Оно может быть изменено, во время работы приложения. Слои могут быть созданы, добавлены в качестве подслоя до одного слоя, затем другого, и удалены из дерева слоев.

Отображение слоев в видах

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

Система видов iOS встроена непосредственно в верхней части слоя Core Animation. Каждый экземпляр UIView автоматически создает экземпляр класса CALayer и устанавливает его в качестве значения свойства слоя вида. Вы можете добавить подслои в слой представления, как потребуется.

В Mac OS X необходимо настроить NSView например таким образом, чтобы он мог принимать слоя. Для отображения корневого слоя дерева слоев, вы установите слой вида, а затем настраиваете вид на использование слоев, как показано в Таблице 2.

Листинг 1 Вставка слоя в вид

// View существующий вид, расположенный в окне
// theRootLayer корневой слой в дереве слоев

[theView setLayer: theRootLayer];
[theView setWantsLayer:YES];

Добавление и удаление слоев из иерархии

Простые экземпляры слоев не вставляют непосредственно в дерево слоев. Вместо этого, чтобы добавлять, вставлять, заменять и удалять слои из дерева слоев, используют методы, описанные в Таблице 1.

Таблица 1 методы управления деревом слоев.

МетодРезультат
addSublayer:Добавляет слой в массив подслоев объекта-приемника.
insertSublayer:atIndex:Вставка слоя в подслои объекта-получателя по указанному индексу.
insertSublayer:below:Вставка слоя в подслои массива объекта-получателя, ниже указанного подслоя.
insertSublayer:above:Вставка слоя в подслои массива объекта-получателя, до указанного подслоя.
removeFromSuperlayerУдаляет объект-приемник из массива подслоев или маску свойств superlayer объекта-приемника.
replaceSublayer:with:Заменяет слой в массиве подслоев объекта-приемника указанным новым слоем.

Изменение положения и изменения размеров слоев

После того, как слой был создан, вы можете перемещать и изменять его программно, просто изменив значение свойства геометрии слоя: frame, bounds, position, anchorPoint, или zPosition.

Если свойство needsDisplayOnBoundsChange слоя YES, содержимое слоя перекэшируется когда границы слоя изменятся. По умолчанию свойство needsDisplayOnBoundsChange NO.

По умолчанию, установка свойств frame, bounds, position, anchorPoint, и zPosition заставляет слой анимировать новые значения.

Автоматическое изменение размеров слоев

CALayer предоставляет механизм для автоматического перемещения и изменения размера подслоев в ответ на их superlayer перемещение или изменение размера. Во многих случаях простая настройка маски автоматического изменения для слоя обеспечивает надлежащее поведение приложения.

Маска автоматического изменения слоя определяется путем объединения константы CAAutoresizingMask, используя побитовое ИЛИ оператора и autoresizingMask свойства слоя на результирующее значение. Таблица 2 показывает, каждая константу маски и как она влияет на изменения размера слоя.

Таблица 2 значения маски автоматического изменения размеров и описание

маски автоматоизмененияОписание
kCALayerHeightSizableЕсли установлено, высота слоя изменяется пропорционально изменению высоты superlayer. В противном случае, высота слоя не меняется по сравнению с высотой в superlayer.
kCALayerWidthSizableЕсли установлено, ширина слоя изменяется пропорционально изменению ширины superlayer. В противном случае ширина слоя не меняется по сравнению с шириной superlayer.
kCALayerMinXMarginЕсли установлено, левый край слоя перемещается пропорционально изменению ширины superlayer. В противном случае, левый край слоя остается в том же положении по отношению к левому краю superlayer.
kCALayerMaxXMarginЕсли установлено, правый край слоя перемещается пропорционально изменению ширины superlayer. В противном случае, правый край слоя остается в том же положении по отношению к superlayer.
kCALayerMaxYMarginЕсли установлено, верхний край слоя перемещается пропорционально изменению высоты superlayer. В противном случае, верхний край слоя остается в том же положении по отношению к superlayer.
kCALayerMinYMarginЕсли установлено, нижний край слоя перемещается пропорционально изменению высоты superlayer. В противном случае, нижний край слоя остается в том же положении по отношению к superlayer.

Рисунок 1 константы маски автоматического изменения размера слоя

Когда одна из этих констант опущена, расположение слоя фиксируется в этом аспекте, когда константа входит в маску, расположение слоя является гибким в этом аспекте.

Подкласс может переопределить методы CALayer resizeSublayersWithOldSize:, и resizeWithOldSuperlayerSize: для настройки автоматического изменения поведения слоя. Метод слоя resizeSublayersWithOldSize: вызывается автоматически всякий раз, когда слой измененяет границы, и посылает resizeWithOldSuperlayerSize: сообщение для каждого подслоя. Каждый подслой сравнивает старые размеры границ с новыми размерами и корректирует свою позицию и размер в соответствии с его маской автоматического изменения размера.

Отсечение подслоев

Когда подвиды Cocoa видов лежат за границами родительскиз видов, они обрезаются по границам родительских видов. Слои удаляют это ограничение, позволяющее подслоям отображаться в полном объеме, независимо от их позиции по отношению к родительскому слою.

Значение свойства masksToBounds слоя определяет, будет ли подслой обрезается до родителя. По умолчанию значение свойства masksToBounds NO, которая предотвращает обрезание подслоев до родителя. На рисунке 2 представлены результаты установки masksToBounds для layerA и как это отразится на отображении layerB и layerC.

Рисунок 2 Пример значения свойства masksToBounds

clipping Layers with masksToBounds
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac