Рисование бед с помощью CALayer - PullRequest
8 голосов
/ 20 августа 2009

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

Мой проект начался тривиально, я загружал изображения и просто рисовал их в UIView через [image drawAtPoint:], а также [image drawInRect:]. Они отлично работают, используя текущий графический контекст.

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

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

  • drawLayer
  • DisplayLayer
  • дисплей
  • drawInContext

Теперь для всех этих методов необходимо установить размер кадра слоя? Требуется ли добавить слой к слою вида?

Единственный метод, который дает мне видимые результаты, это метод drawinContext. Но если я применяю неявную анимацию (например, image.opacity = 0), ничего не происходит, что заставляет меня поверить, что мой слой настроен неправильно.

Кто-нибудь, пожалуйста, верните порядок в этот хаос.

Ответы [ 2 ]

18 голосов
/ 20 августа 2009

Core Animation делает подобные вещи тривиальными. Предложение Брэда верно. Суть в том, что вам не нужен ни один из этих методов, чтобы просто визуализировать слой. Чтобы сделать слой рендерингом, убедитесь, что вы сделали следующее:

  • Установить свойство содержимого с помощью:

    [imageLayer setContents:(id)[[UIImage imageNamed@"image.png"] CGImage]];

  • Установите границы слоя на нужный вам размер.

    [imageLayer setBounds:CGRectMake(0.0f, 0.0f, 50.0f, 50.0f)];

  • Установите положение (x, y location) слоя для отображения на виде. По умолчанию точка привязки является центром слоя. Этот код центрирует слой в вашем представлении.

    [imageLayer setPosition:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];

  • Добавьте слой к слою вашего вида:

    [[[self view] layer] addSublayer:imageLayer];

Кстати, если вы предпочитаете, вы можете установить границы и положение в одном методе, вызвав -setFrame :. Я предпочитаю использовать два звонка сам, так как он кажется мне более читаемым, но это зависит от ваших собственных предпочтений. Если вы не установите границы и положение или рамку слоя, тем не менее, слой не будет визуализироваться.

Если вы предпочитаете, вы можете избежать использования drawInContext, создавая дополнительные слои, которые рисуют контуры, фигуры (см. CAShaperLayer) или дополнительные изображения и добавляют их в качестве подслоев вашего слоя изображений или добавляют их в качестве подслоев вашего родительского слоя и дают их zPosition, которое заставляет их отображаться перед вашим слоем изображения.

Теперь, если вы хотите анимировать непрозрачность, вы можете использовать неявную анимацию, просто установив свойство layer точно так, как вы описали, например, [imageLayer setOpacity: 0.0f]; Это приведет к исчезновению слоя и всех его дочерних слоев в течение 0,25 секунд.

Просто некоторые дополнительные мысли.

С наилучшими пожеланиями.

2 голосов
/ 20 августа 2009

Если все, что вы хотите, чтобы ваши различные слои делали, это отображали по одному изображению, вам не нужно было бы их вообще делать подклассами. Вы должны просто иметь возможность установить изображение (в форме CGImageRef) для свойства contents каждого слоя. Затем слой будет обрабатывать рисунок этого изображения. Вы можете получить представление базового графического изображения UIImage, используя его свойство CGImage только для чтения.

Тем не менее, вы правы, что -drawInContext: является правильным местом для размещения большего количества пользовательских кодов чертежей в подклассе CALayer. Без создания подкласса CALayer вы можете попросить делегата изменить поведение чертежа слоя с помощью метода делегата -drawLayer:inContext:.

Все это подробно описано в разделе «Предоставление содержимого слоя» в руководстве Apple по программированию Core Animation .

...