Howto CALayer масштабируется независимо от границ CALayer - PullRequest
3 голосов
/ 12 февраля 2012

Я не могу найти ответ на этот вопрос.

Я хотел бы знать, как сделать так, чтобы размер изображения в калеере был меньше размера грани калибра.

У меня есть несколько пешек в игре для iPad, каждая из которых является CALayer, и я могу изменить их размер просто с помощью contentsGravity = kCAGravityResizeAspect. Размер изображения составляет 128x128 внутри слоя CALayer 30x30, поэтому размер изображения автоматически изменяется до 30x30, и благодаря тому, что он является рамкой, соотношение сторон сохраняется и работает.

Здесь я устанавливаю границы CALayer пропорционально размеру суперпредставления, поэтому пешки всегда представляют одинаковый относительный размер для вида. Этот находится внутри моего подкласса класса спрайта calayer:

-(void) setSpriteScaleToDice {
    CGFloat newSize = [self superlayer].bounds.size.width * 0.066666667f; 
    self.bounds=CGRectMake(0.0f, 0.0f, newSize, newSize);
    self.contentsGravity = kCAGravityResizeAspect; 
}

Обратите внимание, что в моем случае границы CALayer получают максимум 30x30, что мало для прикосновения. Это проблема, с которой я сталкиваюсь, из-за этого небольшого размера их трудно «дотронуться», иногда дотрагиваться не удается…

Одна из идей, о которых я думаю, заключается в увеличении «границ» калибра при сохранении исходного размера изображения. Проблема в том, что я много искал и перепробовал несколько вариантов с contentGravity, contentsCenter, contentsScale и т. Д ... безуспешно.

В частности, в соответствии с Apple Docs выглядит так, как это сделать с ContentCenter (а не с помощью ContentGravity), однако я получаю деформации в растровом изображении ...

Пожалуйста, любая идея действительно приветствуется, и заранее спасибо,

Луис

Ответы [ 3 ]

2 голосов
/ 12 февраля 2012

Это, вероятно, глупый вопрос, но почему вы используете для этого CALayers вместо UIViews?UIImageView имеет свойство contentMode, которое позволяет вам легко это сделать (не говоря уже о том, что его проще использовать для обработки сенсорных событий).позвольте вам определить под прямоугольник для содержимого, которое будет отображаться внутри, так что это может позволить вам делать то, что вы хотите.

Другой вариант - разместить слой изображения внутри большего слоя и использовать его для теста на попадание..

2 голосов
/ 08 ноября 2012

CAlayer CGFloat contentsScale

/* Defines the scale factor applied to the contents of the layer. If
 * the physical size of the contents is '(w, h)' then the logical size
 * (i.e. for contentsGravity calculations) is defined as '(w /
 * contentsScale, h / contentsScale)'. Applies to both images provided
 * explicitly and content provided via -drawInContext: (i.e. if
 * contentsScale is two -drawInContext: will draw into a buffer twice
 * as large as the layer bounds). Defaults to one. Animatable. */
1 голос
/ 12 февраля 2012

Если вы хотите, чтобы ваше изображение рисовалось в CALayer с размером, отличным от CALayer, вам нужно создать собственный метод drawInContext: и нарисовать изображение, а не устанавливать свойство CALayer contents.Не устанавливайте свойство contents, создайте свое собственное, чтобы отслеживать изображение, которое вы хотите нарисовать.

...