2012-03-23 2 views
1

У меня есть UIImage в UIImageView (объект на изображении). Его нужно анимировать вправо, но эту анимацию нужно маскировать с помощью этой круглой маски. enter image description hereАнимация UIImageView с маской (основные анимации с масками)

Мой текущий код:

CGMutablePathRef path = CGPathCreateMutable(); 

CGPathAddArc(path, NULL, 44, 44, 21, 0, 2 * M_PI, NO); 

CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init]; 
[shapeLayer setPath:path]; 
[shapeLayer setFillColor:[[UIColor blackColor] CGColor]]; 
[shapeLayer setBounds:CGRectMake(0, 0, 44, 44)]; 
[shapeLayer setPosition:CGPointMake(0, 0)]; 

UIImageView *loadingShape = [[UIImageView alloc] initWithFrame:CGRectMake(6.5, 7.5, 89, 40)]; 
[loadingShape setImage:[UIImage imageNamed:@"object_image.png"]]; 
[self addSubview:loadingShape]; 
// Set the mask for the image view's layer 
[[loadingShape layer] setMask:shapeLayer]; 

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationCurve: UIViewAnimationCurveEaseOut]; 
[UIView setAnimationDuration:0.3]; 
[UIView setAnimationRepeatCount:10]; 
[loadingShape setFrame:CGRectMake(0, 7.5, 89, 40)]; 
[UIView commitAnimations]; 

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

Какое оптимальное решение?

ответ

2

Благодаря Курта, я усовершенствовал немного битную мой код и получил то, что я wanter :)

CGMutablePathRef путь = CGPathCreateMutable();

CGPathAddArc(path, NULL, 44, 44, 21, 0, 2 * M_PI, NO); 

CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init]; 
[shapeLayer setPath:path]; 
[shapeLayer setFillColor:[[UIColor blackColor] CGColor]]; 
[shapeLayer setBounds:CGRectMake(0, 0, 44, 44)]; 
[shapeLayer setPosition:CGPointMake(0, 0)]; 

UIView *loadingView = [[UIView alloc] initWithFrame:CGRectMake(6.5, 7.5, 44, 44)]; 

UIImageView *loadingShape = [[UIImageView alloc] initWithFrame:CGRectMake(0, 18, 89, 40)]; 
[loadingShape setImage:[UIImage imageNamed:@"object_image.png"]]; 
[[loadingView layer] setMask:shapeLayer]; 
[loadingView addSubview:loadingShape]; 
[self addSubview:loadingView]; 
// Set the mask for the image view's layer 

CABasicAnimation* anim = [[CABasicAnimation alloc] init]; 
anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 18)]; 
anim.toValue = [NSValue valueWithCGPoint:CGPointMake(15, 18)]; 
anim.keyPath = @"position"; 
anim.timingFunction = [CAMediaTimingFunction functionWithName:@"linear"]; 
anim.duration = 0.3; 
anim.repeatCount = 100000; 
[[loadingShape layer] addAnimation:anim forKey:nil]; 
+0

Вы анимируете 'position', но даете ему' fromValue' и 'toValue', которые являются' CGRect'. Разве они не должны быть «CGPoints»? –

+0

Вы правы, я изменил код. Но оба решения работают :) – dormitkon

4

Слой маски shapeLayer действует как ребенок другого слоя [loadingShape layer]. Когда родительский слой перемещается, ребенок перемещается вместе с ним.

В дополнение к вашей текущей анимации вам нужно будет оживить shapeLayer, в обратном направлении.

Edit: Анимация создана -[UIView beginAnimations:context:] не применяется автоматически к оголенной CALayer, так настроить анимацию вручную.

CGPoint p = /* you decide the new position of the shapeLayer */; 
CABasicAnimation* anim = [[CABasicAnimation alloc] init]; 
anim.toValue = [NSValue valueWithCGPoint:p]; 
anim.keyPath = @"position"; 
anim.timingFunction = [CAMediaTimingFunction functionWithName:@"easeOut"]; 
anim.duration = 0.3; 
anim.repeatCount = 10; 
[shapeLayer.mask addAnimation:anim forKey:nil]; 
[anim release]; 
+0

Хм, пытался сделать это оживляющий положение слоя и границ, но без успеха: | Можете ли вы показать мне некоторые фрагменты? – dormitkon

+0

Вы должны сделать это, оживив положение 'shapeLayer'. Это действительно все, что нужно. –

+0

Я просто попытался, но я получаю тот же эффект: | – dormitkon

Смежные вопросы