«Маскировка» анимации? iPhone SDK - PullRequest
4 голосов
/ 19 ноября 2009

Я искал способы маскировки изображений на iPhone. Я наткнулся на это решение

http://iosdevelopertips.com/cocoa/how-to-mask-an-image.html

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

Это заставляет меня спросить, возможно ли следующее, могу ли я «обрезать» изображения внутри UIImageView? т.е. не изменять размер UIImageView до размера изображений, чтобы некоторые части были обрезаны?

Ответы [ 2 ]

8 голосов
/ 19 ноября 2009

Я не пробовал это для производительности, но вы можете использовать слой Core Animation в качестве маски. Вы можете определить путь для использования в CAShapeLayer и заполнить форму. Затем укажите маску слоя для вашего слоя UIImageView. Что-то вроде:

CGMutablePathRef path = CGPathCreateMutable();
// build the path by adding points
// ...

CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init];
[shapeLayer setPath:path];
[shapeLayer setFillColor:[[UIColor blackColor] CGColor]];
// Set shape layer bounds and position
// ...

// Set the mask for the image view's layer
[[imageView layer] setMask:shapeLayer];

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

5 голосов
/ 07 октября 2010

Я искал высоко и низко и, наконец, нашел решение практически без ограничений. Итак, поехали:

UIImageView *maskeeImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MaskeeImage.png"]];

[maskeeImage setAnimationRepeatCount:-1];
[maskeeImage setAnimationImages:[[NSArray alloc] initWithObjects:[UIImage imageNamed:@"MaskeeImage1.png"], [UIImage imageNamed:@"MaskeeImage2.png"], [UIImage imageNamed:@"MaskeeImage3.png"], nil]];
[maskeeImage startAnimating];

CALayer *maskeeLayer = [maskeeImage layer];
maskeeLayer = CGRectMake(0, 0, 768, 1004);
[[[self view] layer] addSublayer:maskeeLayer];

UIImage *maskImage = [UIImage imageNamed:@"ImageMask.png"];
CALayer *maskLayer = [CALayer layer];
maskLayer.contents = (id) myImageMask.CGImage;
maskLayer.frame = CGRectMake(0, 0, 768, 1004);
[maskeeLayer setMask:maskLayer];

Вот, пожалуйста! Это на самом деле очень легко, если вы знаете, как. Я пытался показать несколько разных вариантов; Использование UIImageViews или UIImages, Animations (которые также можно использовать для маски).

Чтобы подвести итог всего этого, вам, в основном, нужно установить свойство mask для CALayer вашего представления. Каждый подкласс UIView имеет прикрепленный CALayer, так что вы не ограничены в том, откуда вы берете свою маску или маску.

Надеюсь, это помогло. Приветствия, Дилан.

...