Установка расположенных на слое объектов
Расположенные на слое объекты в основе всего, что Вы делаете с Базовой Анимацией. Уровни управляют визуальным содержанием Вашего приложения и предоставляют возможности для изменения стиля и визуального появления того содержания. Несмотря на то, что приложениям для iOS включили поддержку уровня автоматически, разработчики приложений OS X должны включить ее явно, прежде чем они смогут использовать в своих интересах выигрыши в производительности. После того, как включенный, необходимо понять, как сконфигурировать и управлять уровнями приложения для получения эффектов, которые Вы хотите.
Включение базовой поддержки анимации в приложении
В приложениях для iOS всегда включается Базовая Анимация, и каждое представление поддерживается уровнем. В OS X приложения должны явно включить Базовую поддержку Анимации путем выполнения следующего:
Ссылка против платформы QuartzCore. (приложения для iOS должны соединиться против этой платформы, только если они используют Базовые интерфейсы Анимации явно.)
Включите поддержку уровня один или больше из Вашего
NSView
объекты путем выполнения одного из следующих действий:В Ваших файлах пера используйте инспектора Эффектов Представления для включения поддержки уровня представлений. Инспектор выводит на экран флажки для выбранного представления и его подпредставлений. Рекомендуется включить поддержку уровня в представлении содержания окна, когда это возможно.
Для представлений Вы создаете программно, вызываете представление
setWantsLayer:
метод и передача значениеYES
указать, что представление должно использовать уровни.
Включение поддержки уровня одним из предыдущих способов создает поддержанное уровнем представление. С поддержанным уровнем представлением система берет на себя ответственность за создание объекта нижележащего слоя и за хранение того обновленного уровня. В OS X также возможно создать размещающее уровень представление, посредством чего Ваше приложение фактически создает и управляет объектом нижележащего слоя. (Вы не можете создать размещающие уровень представления в iOS.) Для получения дополнительной информации о том, как создать размещающее уровень представление, посмотрите, что Уровень Разместить Позволяет Вам Изменение Расположенный на слое объект в OS X.
Изменение расположенного на слое объекта, связанного с целью
Поддержанные уровнем представления создают экземпляр CALayer
класс по умолчанию, и в большинстве случаев Вам, возможно, не понадобился бы другой тип расположенного на слое объекта. Однако Базовая Анимация обеспечивает различные классы уровня, каждый из которых обеспечивает специализированные возможности, которые Вы могли бы счесть полезным. Выбор различного класса уровня мог бы позволить Вам улучшить производительность или поддерживать определенный тип содержания простым способом. Например, CATiledLayer
класс оптимизирован для отображения больших изображений эффективным способом.
Изменение класса уровня, используемого UIView
Можно изменить тип уровня, используемого представлением iOS путем переопределения представления layerClass
метод и возврат различного объекта класса. Большинство представлений iOS создает a CALayer
объект и использование, что уровень как запоминающее устройство для его содержания. Для большинства Ваших собственных представлений этим выбором по умолчанию является хороший, и Вы не должны должны быть изменять его. Но Вы могли бы найти, что различный класс уровня является более надлежащим в определенных ситуациях. Например, Вы могли бы хотеть изменить класс уровня в следующих ситуациях:
Ваше представление рисует довольный Металл использования или OpenGL ES, когда Вы использовали бы a
CAMetalLayer
илиCAEAGLLayer
объект.Существует специализированный класс уровня, предлагающий лучшую производительность.
Вы хотите использовать в своих интересах некоторые специализированные Базовые классы Слоя анимации, такие как эмиттеры частицы или репликаторы.
Изменение класса уровня представления является очень прямым; пример показан в Перечислении 2-1. Все, что необходимо сделать, переопределить layerClass
метод и возврат объект класса Вы хотите использовать вместо этого. До дисплея представление вызывает layerClass
метод и использование возвращенный класс для создания нового расположенного на слое объекта для себя. После того, как создаваемый, расположенный на слое объект представления не может быть изменен.
Перечисление 2-1 , Указывающее класс уровня представления iOS
+ (Class) layerClass { |
return [CAMetalLayer class]; |
} |
Для списка классов уровня и как Вы используете их, посмотрите, что Различные Классы Уровня Обеспечивают Специализированные Способы поведения.
Изменение класса уровня, используемого NSView
Можно изменить класс уровня по умолчанию, используемый NSView
объект путем переопределения makeBackingLayer
метод. В Вашей реализации этого метода создайте и возвратите расположенный на слое объект, который Вы хотите, чтобы AppKit использовал для поддержки пользовательского представления. Вы могли бы переопределить этот метод в ситуациях, где Вы хотите использовать пользовательский уровень, такой как прокрутка или плиточный слой.
Для списка классов уровня и как Вы используете их, посмотрите, что Различные Классы Уровня Обеспечивают Специализированные Способы поведения.
Хостинг уровня позволяет Вам изменить расположенный на слое объект в OS X
Размещающее уровень представление NSView
объект, для которого Вы создаете и управляете нижележащим слоем, возражает себе. Вы могли бы использовать хостинг уровня в ситуациях, где Вы хотите управлять типом расположенного на слое объекта, связанного с представлением. Например, Вы могли бы создать размещающее уровень представление так, чтобы можно было присвоить класс уровня кроме значения по умолчанию CALayer
класс. Вы могли бы также использовать его в ситуациях, где Вы хотите использовать единственное представление для управления иерархией автономных уровней.
Когда Вы вызываете setLayer:
метод Вашего представления и обеспечивает расположенный на слое объект, AppKit проявляет основанный на невмешательстве подход к тому уровню. Обычно, AppKit обновляет расположенный на слое объект представления, но в размещающей уровень ситуации он не делает для большинства свойств.
Для создания размещающего уровень представления создайте расположенный на слое объект и свяжите его с представлением прежде, чем вывести на экран представление на экране, как показано в Перечислении 2-2. В дополнение к установке расположенного на слое объекта необходимо все еще вызвать setWantsLayer:
метод, чтобы позволить представлению знать, что это должно использовать уровни.
Перечисление 2-2 , Создающее размещающее уровень представление
// Create myView... |
[myView setWantsLayer:YES]; |
CATiledLayer* hostedLayer = [CATiledLayer layer]; |
[myView setLayer:hostedLayer]; |
// Add myView to a view hierarchy. |
Если Вы принимаете решение разместить уровни сами, необходимо установить contentsScale
в подходящее время свойство самостоятельно и обеспечивает содержание с высокой разрешающей способностью. Для получения дополнительной информации о довольном с высокой разрешающей способностью и масштабные коэффициенты, посмотрите Работу с Изображениями С высокой разрешающей способностью.
Различные классы уровня обеспечивают специализированные способы поведения
Базовая Анимация определяет много классов стандартного слоя, каждый из которых был разработан для определенного варианта использования. CALayer
класс является корневым классом для всех расположенных на слое объектов. Это определяет поведение, которое все расположенные на слое объекты должны поддерживать и являются типом по умолчанию, используемым поддержанными уровнем представлениями. Однако можно также указать один из классов уровня в Таблице 2-1.
Класс | Использование |
---|---|
Используемый для реализации Базовой Основанной на анимации системы эмиттера частицы. Объект эмиттерного слоя управляет генерацией частиц и их источника. | |
Используемый для рисования цветового градиента, заполняющего форму уровня (в границах любых скругленных углов). | |
| Используемый, чтобы установить и продать drawable текстуры для рендеринга содержания уровня использование Металла. |
| Используемый для установки запоминающего устройства и контекста для рендеринга содержания уровня использование OpenGL ES (iOS) или OpenGL (OS X). |
Используемый, когда Вы хотите сделать копии одного или более подуровней автоматически. Репликатор делает копии для Вас и использует свойства, которые Вы указываете для изменения появления или атрибутов копий. | |
Используемый для управления большой областью с возможностью прокрутки сочинил многократных подуровней. | |
Используемый для рисования кубического Сплайна Безье. Слои фигуры выгодны для рисования находящихся на пути форм, потому что они всегда приводят к четкому пути, в противоположность пути, Вы вовлекаете запоминающее устройство уровня, которое не выглядело бы как хорошее, когда масштабируется. Однако четкие результаты действительно включают рендеринг формы на основном потоке и кэшировании результатов. | |
Используемый для рендеринга простой или приписанной строки текста. | |
Используемый для управления большим изображением, которое может быть разделено на меньшие мозаики и представлено индивидуально с поддержкой того, чтобы увеличить масштаб и из содержания. | |
Используемый для рендеринга истинной 3D иерархии слоев, а не сглаженной иерархии слоев, реализованной другими классами уровня. | |
Используемый для рендеринга Кварцевого состава Композитора. ( Только OS X) |
Обеспечение содержания уровня
Уровни являются объектами данных, управляющими содержанием, предоставленным Вашим приложением. Содержание уровня состоит из битового массива, содержащего визуальные данные, которые Вы хотите вывести на экран. Можно обеспечить содержание для того битового массива одним из трех способов:
Присвойте объект изображения непосредственно расположенному на слое объекту
contents
свойство. (Этот метод является лучшим для содержания уровня, никогда, или редко, изменяющегося.)Присвойте объект делегата уровню и позвольте делегату нарисовать содержание уровня. (Этот метод является лучшим для содержания уровня, которое могло бы периодически изменяться и может быть предоставлено внешним объектом, таким как представление.)
Определите подкласс уровня и переопределите один из его методов рисования обеспечить содержание уровня сами. (Этот метод является надлежащим, если необходимо создать пользовательский подкласс уровня так или иначе или если Вы хотите изменить фундаментальное поведение рисования уровня.)
Единственное время, которое необходимо взволновать по поводу обеспечения содержания для уровня, - при создании расположенного на слое объекта сами. Если Ваше приложение содержит только поддержанные уровнем представления, Вы не должны волноваться об использовании ни одного из предыдущих методов для обеспечения содержания уровня. Поддержанные уровнем представления автоматически обеспечивают содержание для своих связанных уровней самым эффективным возможным способом.
Используя изображение для содержания уровня
Поскольку уровень является просто контейнером для управления растровым изображением, можно присвоить изображение непосредственно уровню contents
свойство. Присвоение изображения к уровню просто и позволяет Вам указать точное изображение, которое Вы хотите вывести на экран на экране. Уровень использует объект изображения, который Вы обеспечиваете непосредственно, и не пытается создать его собственную копию того изображения. Это поведение может сохранить память в случаях, где Ваше приложение использует то же изображение в многократных местах.
Изображение, которое Вы присваиваете уровню, должно быть a CGImageRef
ввести. (В OS X v10.6 и позже, можно также присвоиться NSImage
объект.) При присвоении изображений, не забудьте обеспечивать изображение, разрешение которого соответствует разрешение собственного устройства. Для устройств с дисплеями Сетчатки это могло бы также потребовать, чтобы Вы корректировались contentsScale
свойство изображения. Для получения информации об использовании содержания с высокой разрешающей способностью с Вашими уровнями посмотрите Работу с Изображениями С высокой разрешающей способностью.
Используя делегата для обеспечения содержания уровня
Если содержание Ваших изменений слоя динамично, можно использовать объект делегата обеспечить и обновить то содержание при необходимости. Во время дисплея уровень вызывает методы Вашего делегата для обеспечения необходимого содержания:
Если Ваш делегат реализует
displayLayer:
метод, та реализация ответственна за создание битового массива и присвоение его к уровнюcontents
свойство.Если Ваш делегат реализует
drawLayer:inContext:
метод, Базовая Анимация создает битовый массив, создает графический контекст для вовлечения того битового массива, и затем вызывает метод делегата заполнить битовый массив. Весь Ваш метод делегата должен сделать, вовлекают предоставленный графический контекст.
Объект делегата должен реализовать любого displayLayer:
или drawLayer:inContext:
метод. Если делегат реализует обоих displayLayer:
и drawLayer:inContext:
метод, уровень вызывает только displayLayer:
метод.
Переопределение displayLayer:
метод является самым подходящим для ситуаций, когда Ваше приложение предпочитает загружаться, или создать битовые массивы это хочет вывести на экран. Перечисление 2-3 показывает демонстрационную реализацию displayLayer:
метод делегата. В этом примере делегат использует объект помощника загрузить и вывести на экран изображение, в котором он нуждается. Метод делегата выбирает, какое изображение вывести на экран на основе его собственного внутреннего состояния, которое в примере является пользовательским вызванным свойством displayYesImage
.
Перечисление 2-3 , Устанавливающее содержание уровня непосредственно
- (void)displayLayer:(CALayer *)theLayer { |
// Check the value of some state property |
if (self.displayYesImage) { |
// Display the Yes image |
theLayer.contents = [someHelperObject loadStateYesImage]; |
} |
else { |
// Display the No image |
theLayer.contents = [someHelperObject loadStateNoImage]; |
} |
} |
Если у Вас нет предварительно представленных изображений или объекта помощника создать битовые массивы для Вас, Ваш делегат может нарисовать содержание динамично с помощью drawLayer:inContext:
метод. Перечисление 2-4 показывает демонстрационную реализацию drawLayer:inContext:
метод. В этом примере делегат рисует простой изогнутый контур с помощью фиксированной ширины и текущего цвета рендеринга.
Перечисление 2-4 , Получающее содержание уровня
- (void)drawLayer:(CALayer *)theLayer inContext:(CGContextRef)theContext { |
CGMutablePathRef thePath = CGPathCreateMutable(); |
CGPathMoveToPoint(thePath,NULL,15.0f,15.f); |
CGPathAddCurveToPoint(thePath, |
NULL, |
15.f,250.0f, |
295.0f,250.0f, |
295.0f,15.0f); |
CGContextBeginPath(theContext); |
CGContextAddPath(theContext, thePath); |
CGContextSetLineWidth(theContext, 5); |
CGContextStrokePath(theContext); |
// Release the path |
CFRelease(thePath); |
} |
Для поддержанных уровнем представлений с пользовательским содержанием необходимо продолжать переопределять методы представления, чтобы сделать получение. Поддержанное уровнем представление автоматически делает себя делегатом его уровня и реализует необходимые методы делегата, и Вы не должны изменять ту конфигурацию. Вместо этого необходимо реализовать представление drawRect:
метод для рисования содержания.
В OS X v10.8 и позже, альтернатива получению должна обеспечить битовый массив путем переопределения wantsUpdateLayer
и updateLayer
методы Вашего представления. Переопределение wantsUpdateLayer
и возврат YES
причины NSView
класс для следования за альтернативным путем рендеринга. Вместо вызова drawRect:
, представление вызывает Ваш updateLayer
метод, реализация которого должна присвоить битовый массив непосредственно уровню contents
свойство. Это - один сценарий, где AppKit ожидает, что Вы установите содержание расположенного на слое объекта представления непосредственно.
Обеспечение содержания уровня посредством разделения на подклассы
При реализации пользовательского класса уровня так или иначе можно переопределить методы рисования класса уровня сделать любое получение. Это редко для расположенного на слое объекта для генерации самого пользовательского содержания, но уровни, конечно, могут управлять дисплеем содержания. Например, CATiledLayer
класс управляет большим изображением путем повреждения его в меньшие мозаики, которыми можно управлять и представить индивидуально. Поскольку только уровень имеет информацию, о которой мозаики должны быть представлены в любой момент времени, это управляет поведением получения непосредственно.
При разделении на подклассы можно использовать любой из следующих методов для рисования содержания уровня:
Переопределите уровень
display
метод и использование это для установкиcontents
свойство уровня непосредственно.Переопределите уровень
drawInContext:
метод и использование это для вовлечения предоставленного графического контекста.
Какой метод, который Вы переопределяете, зависит от того, в каком количестве управления Вы нуждаетесь по процессу получения. display
метод является основной точкой входа для обновления содержания уровня, столь переопределяющего, что метод помещает Вас в полный контроль над процессом. Переопределение display
метод также означает, что Вы ответственны за создание CGImageRef
быть присвоенным contents
свойство. Если Вы просто хотите нарисовать содержание (или иметь Ваш уровень, управляют операцией рисования), можно переопределить drawInContext:
метод вместо этого и позволил уровню создать запоминающее устройство для Вас.
При тонкой настройке содержания Вы обеспечиваете
Когда Вы присваиваете изображение contents
свойство уровня, уровень contentsGravity
свойство определяет, как тем изображением управляют для адаптации текущим границам. По умолчанию, если изображение больше или меньше, чем текущие границы, расположенный на слое объект масштабирует изображение для адаптации в свободном месте. Если форматное соотношение границ уровня отличается, чем форматное соотношение изображения, это может заставить изображение быть искаженным. Можно использовать contentsGravity
свойство, чтобы гарантировать, что Ваше содержание представлено лучшим возможным способом.
Значения можно присвоиться к contentsGravity
свойство разделено на две категории:
Основанные на позиции гравитационные постоянные позволяют Вам прикреплять свое изображение к определенному краю или углу прямоугольника границ уровня, не масштабируя изображение.
Основанные на масштабировании гравитационные постоянные позволяют Вам расширять изображение с помощью одной из нескольких опций, некоторые из которых сохраняют форматное соотношение и некоторые из которых не делают.
Рисунок 2-1 показывает, как основанные на позиции настройки силы тяжести влияют на Ваши изображения. За исключением kCAGravityCenter
постоянный, каждая константа контакты изображение к определенному краю или углу прямоугольника границ уровня. kCAGravityCenter
постоянные центры изображение в уровне. Ни одна из этих констант не заставляет изображение масштабироваться всегда, таким образом, изображение всегда представляется в его первоначальном размере. Если изображение больше, чем границы уровня, это может привести к частям изображения, отсекаемого, и если изображение меньше, части уровня, не покрытые изображением, показывают цвет фона уровня, если установлено.
Рисунок 2-2 показывает, как основанные на масштабировании гравитационные постоянные влияют на Ваши изображения. Все эти константы масштабируют изображение, если оно не соответствует точно в прямоугольнике границ уровня. Различие между режимами - то, как они имеют дело с исходным форматным соотношением изображения. Некоторые режимы сохраняют его, и другие не делают. По умолчанию, уровень contentsGravity
свойство установлено в kCAGravityResize
постоянный, который является единственным режимом, не сохраняющим пропорцию изображения.
Работа с изображениями с высокой разрешающей способностью
Уровни не имеют никакого свойственного знания разрешения экрана базового устройства. Уровень просто хранит указатель на Ваш битовый массив и выводит на экран его лучшим способом, возможным данный доступные пиксели. Если Вы присваиваете изображение уровню contents
свойство, необходимо сказать Базовую Анимацию о разрешении изображения путем установки уровня contentsScale
свойство к надлежащему значению. Значение по умолчанию свойства 1.0
, то, которое является подходящим для изображений, намеревалось быть выведенным на экран на экранах стандартного разрешения. Если Ваше изображение предназначается для дисплея Сетчатки, установите значение этого свойства к 2.0
.
Изменение значения contentsScale
свойство только необходимо при присвоении битового массива уровню непосредственно. Поддержанное уровнем представление в UIKit и AppKit автоматически устанавливает масштабный коэффициент своего уровня к надлежащему значению на основе разрешения экрана и содержания, которым управляет представление. Например, если Вы присваиваетесь NSImage
возразите против contents
свойство уровня в OS X, AppKit надеется видеть, существует ли и стандарт - и варианты с высокой разрешающей способностью изображения. Если существует, AppKit использует корректный вариант для текущего разрешения и устанавливает значение contentsScale
свойство для соответствия.
В OS X основанные на позиции гравитационные постоянные влияют на способ, которым представления изображения выбраны из NSImage
объект присвоился к уровню. Поскольку эти константы не заставляют изображение масштабироваться, Базовая Анимация полагается contentsScale
свойство для выбора представления изображения с самой надлежащей плотностью пикселей.
В OS X делегат уровня может реализовать layer:shouldInheritContentsScale:fromWindow:
метод и использование это для реакции на изменения в масштабном коэффициенте. AppKit автоматически вызывает тот метод каждый раз, когда разрешение для данного окна изменяется, возможно потому что окно переместилось между стандартным разрешением и экранами с высокой разрешающей способностью. Ваша реализация этого метода должна возвратиться YES
если делегат поддерживает изменение разрешения изображения уровня. Метод должен тогда обновить содержание уровня по мере необходимости для отражения нового разрешения.
Корректировка визуального стиля и появления уровня
Расположенные на слое объекты создали в визуальных украшениях, таких как цвет рамки и цвет фона, который можно использовать для дополнения основного содержания уровня. Поскольку эти визуальные украшения не требуют никакого рендеринга с Вашей стороны, они позволяют использовать уровни в качестве автономных объектов в некоторых ситуациях. Все, что необходимо сделать, установлено, свойство на уровне и уровне обрабатывает необходимое получение, включая любые анимации. Для дополнительных иллюстраций того, как эти визуальные украшения влияют на появление уровня, посмотрите Анимации Свойства Стиля слоя.
Уровни имеют свой собственный фон и границу
Уровень может вывести на экран заполненный фон и перечеркиваемую границу в дополнение к ее основанному на изображении содержанию. Цвет фона представляется позади изображения содержания уровня, и граница представляется к тому же изображением, как показано на рисунке 2-3. Если уровень содержит подуровней, они также появляются под границей. Поскольку цвет фона находится позади Вашего изображения, тот цвет сияния через любые прозрачные части Вашего изображения.
Перечисление 2-5 показывает, что код должен был выбрать цвет фона и границу для уровня. Все эти свойства animatable.
Перечисление 2-5 , Выбирающее цвет фона и границу уровня
myLayer.backgroundColor = [NSColor greenColor].CGColor; |
myLayer.borderColor = [NSColor blackColor].CGColor; |
myLayer.borderWidth = 3.0; |
Если Вы выбираете цвет фона своего уровня к непрозрачному цвету, рассматриваете установку непрозрачного свойства уровня к YES
. Выполнение так может улучшить производительность при составлении композита уровня на экране и избавляет от необходимости запоминающее устройство уровня управлять альфа-каналом. Вы не должны отмечать уровень как непрозрачный, если он также имеет ненулевой угловой радиус, все же.
Поддержка слоев угловой радиус
Можно создать эффект скругленного прямоугольника для уровня путем добавления углового радиуса к нему. Угловой радиус является визуальным украшением что часть масок углов прямоугольника границ уровня, чтобы позволить базовому содержанию показывать через, как показано на рисунке 2-4. Поскольку это включает применение маски прозрачности, угловой радиус не влияет на изображение в уровне contents
свойство, если masksToBounds
свойство установлено в YES
. Однако угловой радиус всегда влияет, как нарисованы цвет фона и граница уровня.
Для применения углового радиуса к уровню укажите значение для cornerRadius
свойство уровня. Значение радиуса, которое Вы указываете, измерено в точках и применено ко все четыре угла уровня до дисплея.
Поддержка слоев встроенные тени
CALayer
класс включает несколько свойств для конфигурирования эффекта тени. Тень добавляет глубину к уровню, заставляя его появиться, как будто это плавает выше его базового содержания. Это - другой тип визуального украшения, которое Вы могли бы счесть полезным в особых ситуациях для Вашего приложения. С уровнями можно управлять цветом тени, размещением относительно содержания уровня, непрозрачности и формы.
Значение непрозрачности для теней уровня установлено в 0
по умолчанию, который эффективно скрывает тень. Изменение непрозрачности к ненулевому значению заставляет Базовую Анимацию рисовать тень. Поскольку тени расположены непосредственно под уровнем по умолчанию, Вы, возможно, также должны были бы изменить смещение тени, прежде чем Вы будете видеть его. Важно помнить, тем не менее, что смещения, которые Вы указываете для тени, применяются с помощью собственной системы координат уровня, отличающейся на iOS и OS X. Рисунок 2-5 показывает уровень с тенью, расширяющейся вниз и направо от уровня. В iOS это требует указания положительного значения для оси y, но в OS X значение должно быть отрицательным.
При добавлении теней к уровню тень является частью содержания уровня, но фактически расширяется вне прямоугольника границ уровня. В результате, если Вы включаете masksToBounds
свойство для уровня, эффект тени отсекается вокруг краев. Если Ваш уровень содержит какое-либо прозрачное содержание, это может вызвать нечетный эффект, где часть тени непосредственно под Вашим уровнем все еще видима, но часть, расширяющаяся вне Вашего уровня, не. Если Вы хотите тень, но также и хотите использовать маскирование границ, Вы используете два уровня вместо одного. Примените маску к уровню, содержащему Ваше содержание, и затем встройте тот уровень во втором уровне того же самого размера, имеющего включенный эффект тени.
Для примеров того, как тени применяются к уровням, посмотрите Теневые Свойства.
Фильтры добавляют визуальные эффекты к представлениям OS X
В приложениях OS X можно применить Базовые фильтры Изображения непосредственно к содержанию уровней. Вы могли бы сделать это, чтобы размыть или увеличить резкость содержания Вашего уровня, изменить цвета, исказить содержание или выполнить много других типов операций. Например, программа обработки изображений могла бы использовать эти фильтры для изменения изображения непагубно, в то время как программа редактирования видео могла бы использовать их для реализации различных типов видео эффектов перехода. И потому что фильтры применяются к содержанию уровня в аппаратных средствах, рендеринг является быстрым и гладким.
Для данного уровня можно применить фильтры и к приоритетному и к фоновому содержанию уровня. Приоритетное содержание состоит из всего, что сам уровень содержит, включая изображение в contents
свойство, его цвет фона, его граница и содержание ее подуровней. Фоновое содержание является содержанием, непосредственно находящимся под уровнем, но не фактически частью самого уровня. Фоновое содержание большинства уровней является содержанием своего непосредственного суперуровня, который может быть полно или частичный затенен уровнем. Например, Вы могли бы применить фильтр размытия к фоновому содержанию, когда Вы хотите, чтобы пользователь фокусировался на приоритетном содержании уровня.
Вы указываете фильтры путем добавления CIFilter
объекты к следующим свойствам Вашего уровня:
filters
свойство содержит массив фильтров, влияющих на приоритетное содержание уровня только.backgroundFilters
свойство содержит массив фильтров, влияющих на фоновое содержание уровня только.compositingFilter
свойство определяет, как приоритетное и фоновое содержание уровня составляется вместе.
Для добавления фильтра к уровню необходимо сначала определить местоположение и создать CIFilter
возразите и затем сконфигурируйте его прежде, чем добавить его к Вашему уровню. CIFilter
класс включает несколько методов класса для определения местоположения доступных Базовых фильтров Изображения, такой как filterWithName:
метод. Создание фильтра является только первым шагом, все же. Много фильтров имеют параметры, определяющие, как фильтр изменяет изображение. Например, фильтр размытия поля имеет входной параметр радиуса, влияющий на сумму применяющейся размытости. Необходимо всегда обеспечивать значения для этих параметров как часть процесса конфигурации фильтра. Однако один общий параметр, который Вы не должны указывать, является входным изображением, которое предоставлено самим уровнем.
При добавлении фильтров к уровням, лучше конфигурировать параметры фильтра до добавления фильтра к уровню. Главная причина для того, чтобы сделать так состоит в том, который когда-то добавил к уровню, Вы не можете изменить CIFilter
возразите себе. Однако можно использовать уровень setValue:forKeyPath:
метод для изменения значений фильтра после факта.
Перечисление 2-6 показывает, как создать и применить фильтр искажения повышения к расположенному на слое объекту. Этот фильтр зажимает исходные пиксели уровня внутрь, искажая те пиксели, самые близкие к указанной центральной точке больше всего. Заметьте в примере, что Вы не должны указывать входное изображение для фильтра, потому что изображение уровня используется автоматически.
Перечисление 2-6 , Применяющее фильтр к уровню
CIFilter* aFilter = [CIFilter filterWithName:@"CIPinchDistortion"]; |
[aFilter setValue:[NSNumber numberWithFloat:500.0] forKey:@"inputRadius"]; |
[aFilter setValue:[NSNumber numberWithFloat:1.25] forKey:@"inputScale"]; |
[aFilter setValue:[CIVector vectorWithX:250.0 Y:150.0] forKey:@"inputCenter"]; |
myLayer.filters = [NSArray arrayWithObject:aFilter]; |
Для получения информации о доступных Базовых фильтрах Изображения посмотрите Базовую Ссылку Фильтра Изображения.
Политика перерисовки уровня для представлений OS X влияет на производительность
В OS X поддержанные уровнем представления поддерживают несколько различных политик для определения, когда обновить содержание нижележащего слоя. Поскольку существуют различия между собственным AppKit, получающим модель и тем, представленным Базовой Анимацией, эти политики упрощают перемещать Ваш более старый код на Базовую Анимацию. Можно сконфигурировать эти политики на основе представления представлением для обеспечения лучшей производительности для каждого из представлений.
Каждое представление определяет a layerContentsRedrawPolicy
метод, возвращающий политику перерисовки для уровня представления. Вы устанавливаете политику с помощью setLayerContentsRedrawPolicy:
метод. Для сохранения совместимости с ее традиционной моделью получения AppKit устанавливает политику перерисовки в NSViewLayerContentsRedrawDuringViewResize
по умолчанию. Однако можно изменить политику на любое из значений в Таблице 2-2. Заметьте, что рекомендуемая политика перерисовки не является политикой по умолчанию.
Политика | Использование |
---|---|
Это - рекомендуемая политика. С этой политикой изменения геометрии представления автоматически не заставляют представление обновлять содержание своего уровня. Вместо этого существующее содержание уровня расширяется и управляется для упрощения изменений геометрии. Чтобы вынудить представление перерисовать себя и обновить содержание уровня, необходимо явно вызвать представление Эта политика наиболее близко представляет стандартное поведение для Базовых Слоев анимации. Однако это не политика по умолчанию и должно быть установлено явно. | |
Это - политика перерисовки по умолчанию. Эта политика поддерживает максимальную совместимость с традиционным получением AppKit путем перекэширования содержания уровня каждый раз, когда изменяется геометрия представления. Это поведение приводит к представлению | |
С этой политикой AppKit рисует уровень в своем заключительном размере до любого, изменяют размеры операций и кэшей тот битовый массив. Изменять размеры работа использует кэшированное растровое изображение в качестве стартового изображения, масштабируя его для адаптации старому прямоугольнику границ. Это тогда анимирует битовый массив к своему заключительному размеру. Это поведение может заставить содержание представления казаться расширенным или искаженным в начале анимации и лучше в ситуациях, где начальное появление не важно или не примечательно. | |
С этой политикой AppKit не обновляет уровень вообще, даже когда Вы вызываете |
Политики перерисовки представления улучшают потребность использовать автономных подуровней для улучшения производительности получения. До введения политик перерисовки представления были некоторые поддержанные уровнем представления, рисовавшие более часто, чем было необходимо и таким образом вызванные проблемы производительности. Решение этих, которые выпускает производительность, состояло в том, чтобы использовать подуровней для представления тех частей содержания представления, не требовавшего регулярной перерисовки. С введением политик перерисовки в OS X v10.6, теперь рекомендуется установить политику перерисовки поддержанного уровнем представления в надлежащее значение, вместо того, чтобы создать явные иерархии подуровня.
Добавление пользовательских свойств к уровню
CAAnimation
и CALayer
классы расширяют соглашения кодирования значения ключа поддерживать пользовательские свойства. Можно использовать это поведение добавить данные к уровню и получить его с помощью пользовательского ключа, который Вы определяете. Можно даже связать действия с пользовательскими свойствами так, чтобы при изменении свойства была выполнена соответствующая анимация.
Для получения информации о том, как установить и получить пользовательские свойства, видит, что Значение ключа Кодирует Совместимые Контейнерные классы. Для получения информации о добавляющих действиях к Вашим расположенным на слое объектам посмотрите Изменение Поведения Уровня По умолчанию.
Печать содержания поддержанного уровнем представления
Во время печати уровни перерисовывают свое содержание по мере необходимости для размещения среды печати. Принимая во внимание, что Базовая Анимация обычно полагается на кэшированные растровые изображения при рендеринге на экран, она перерисовывает то содержание при печати. В частности если поддержанное уровнем представление использует drawRect:
метод для обеспечения содержания уровня, Базовых вызовов Анимации drawRect:
снова во время печати для генерации печатного содержания уровня.