Оформление внешнего вида слоев Core Animation

Cocoa

NSView обеспечивает классическую модель позиционирования видов по отношению к их superview, когда они изменяют размер. Хотя слои поддерживают эту модель, Core Animation на Mac OS X обеспечивает более общий механизм управления компоновки, который позволяет разработчикам писать собственные менеджеры компоновки. Пользовательский менеджер компоновки (который реализует протокол CALayoutManager) может быть определен для слоя, который затем принимает на себя ответственность за обеспечение расположения подслоев слоя.

iOS Примечание: CALayer класс в iOS поддерживает только модели позиционирования, они не обеспечивает пользовательские менеджеры компоновки. Однако, если вы хотите вручную позиционировать слои связанные с конкретным видом, можно переопределить метод layoutSubviews этого вида и реализовать свой собственный код расположения там.

Ограничения менеджера макета

Ограничение на основе слоя позволяет определить положение и размер слоя, используя отношения между собой его родственными слоями или его superlayer. Отношения представлены экземпляром класса CAConstraint, которые хранятся в массиве в свойстве подслоев constraints.

На рисунке 1 показана схема атрибутов, которые можно использовать при определении отношений.

Рисунок 1 Ограничения атрибутов менеджера макета

CAConstraint

При использовании ограничений макета необходимо сначала создать экземпляр CAConstraintLayoutManager и установить его в качестве менеджера компоновки родительского слоя. Затем создать ограничения для подслоя на экземпляре объекта CAConstraint и добавить их в ограничения подслоя с использованием addConstraint:. Каждый CAConstraint инкапсулирует одно отношение геометрии между двумя слоями на одной оси.

К одноуровневым слоям обращаются по имени, используя свойство слоя name. Специальное имя superlayer используется для обозначения superlayer слоя.

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

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

Рисунок 2 Пример ограничений макета

Ограничения макета

Листинг 1 Настройка ограничений слоя

// создаем и настраиваем менеджер ограничения макета для theLayer
theLayer.layoutManager=[CAConstraintLayoutManager layoutManager];

CALayer *layerA = [CALayer layer];
layerA.name = @"layerA";

layerA.bounds = CGRectMake(0.0,0.0,100.0,25.0);
layerA.borderWidth = 2.0;

[layerA addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidY
                                                 relativeTo:@"superlayer"
                                                  attribute:kCAConstraintMidY]];

[layerA addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidX
                                                 relativeTo:@"superlayer"
                                                  attribute:kCAConstraintMidX]];

[theLayer addSublayer:layerA];

CALayer *layerB = [CALayer layer];
layerB.name = @"layerB";
layerB.borderWidth = 2.0;

[layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintWidth
                                                 relativeTo:@"layerA"
                                                  attribute:kCAConstraintWidth]];

[layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidX
                                                 relativeTo:@"layerA"
                                                  attribute:kCAConstraintMidX]];

[layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY
                                                 relativeTo:@"layerA"
                                                  attribute:kCAConstraintMinY
                                                     offset:-10.0]];

[layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinY
                                                 relativeTo:@"superlayer"
                                                  attribute:kCAConstraintMinY
                                                     offset:+10.0]];

[theLayer addSublayer:layerB];

Вот что делает этот код:

  1. Создает экземпляр CAConstraintLayoutManager и устанавливает его в качестве свойства LayoutManager у theLayer.
  2. Создает экземпляр CALayer (layerA) и устанавливает name свойство слоя в "layerA".
  3. Границы layerA установлены в (0.0,0.0,100.0,25.0).
  4. Создает CAConstraint объект и добавляет его как ограничение layerA.

    Это ограничение выравнивает центр по горизонтали layerA с центром по горизонтали superlayer.

  5. Создает второй объект CAConstraint, и добавляет его в качестве ограничения layerA.

    Это ограничение выравнивает вертикальный центр layerA с вертикальным центром superlayer.

  6. Добавляет layerA как подслой theLayer.
  7. Создает экземпляр CALayer (layerB) и устанавливает name свойство слоя в "layerB".
  8. Создает CAConstraint объект и добавляет его как ограничение layerA.

    Это ограничение устанавливает ширину layerB по ширине layerA.

  9. Создает второй объект CAConstraint, и добавляет его в качестве ограничения layerB.

    Это ограничение устанавливает горизонтальный центр layerB таким же, как горизонтальный центр layerA.

  10. Создает третий объект CAConstraint, и добавляет его в качестве ограничения layerB.

    Это ограничение устанавливает верхний край layerB на 10 пунктов ниже нижнего края layerA.

  11. Создает четвертый объект CAConstraint, и добавляет его в качестве ограничения layerB.

    Это ограничение устанавливает нижний край layerB на 10 пунктов выше нижнего края superlayer.

Предупреждение Существует возможность создавать ограничения, которые приводят к круговым ссылкам на одни и те же атрибуты. В случаях, когда макет не может быть вычислен, поведение не определено.
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac