2009-11-19 3 views
4

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

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

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

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

ответ

8

Я не пробовал это для производительности, но вы можете использовать слой 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]; 

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

+0

Спасибо, матовый, именно то, что я искал, также поднял ваш ответ. –

5

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

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 (которые также могут использоваться для маски).

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

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