2014-10-10 5 views
1

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

UIView *maskView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.worldImageView.frame.size.height, self.worldImageView.frame.size.height)]; 

// ...position maskView... 
maskView.layer.position = CGPointMake(CGRectGetMidX([self.view bounds]), CGRectGetMidY([self.view bounds])); 

maskView.layer.backgroundColor = [UIColor blackColor].CGColor; 

maskView.layer.cornerRadius = 90; 

self.worldImage = [[UIImageView alloc] init]; 
self.worldImage.frame = self.worldImageView.frame; 
self.worldImage.image = [UIImage imageNamed:@"continents.png"]; 
[maskView addSubview:self.worldImage]; 

[self.view addSubview:maskView]; 

CABasicAnimation* worldAnimation = [[CABasicAnimation alloc] init]; 
[worldAnimation setFromValue:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width + 50, CGRectGetMidY([maskView bounds]))]]; 
[worldAnimation setToValue:[NSValue valueWithCGPoint:CGPointMake(-50, CGRectGetMidY([maskView bounds]))]]; 
worldAnimation.keyPath = @"position"; 
worldAnimation.duration = 6.0f; 
worldAnimation.repeatCount = HUGE_VALF; 
[[self.worldImage layer] addAnimation:worldAnimation forKey:nil]; 

Я не знаю, объяснил ли я это достаточно хорошо. Скажите, пожалуйста, если вам нужна дополнительная информация. Заранее спасибо!

+0

Вы говорите, что маска перемещается вместе с изображением, но вы этого не хотите? – ravron

+0

Да, просмотр изображения по-прежнему замаскирован, пока он оживляет. – PoKoBros

+0

Хорошо, но какое поведение * делать * вы хотите? Вы говорите, что хотите, чтобы «окно», которое представляет собой маска, неподвижно, а изображение движется за ней? – ravron

ответ

2

Ваша проблема заключается в том, что к объекту mask объекта UIView прилагается к нему UIView - они не могут перемещаться отдельно. Технически это фактически привязано к лежащему в основе слову представления, но что угодно.

Если вы хотите, чтобы изображение отображалось так, как будто оно проходит перед круговым окном (чтобы вы могли видеть его по мере его прохождения), вам нужно добавить его в качестве подсмотра представления с помощью маски. Таким образом, вы могли бы сделать что-то вроде этого:

UIView *maskView = [[UIView alloc] init]; 

// ...position maskView... 

maskView.layer.cornerRadius = 90; 
maskView.clipsToBounds = YES; 

self.worldImage = [[UIImageView alloc] init]; 
self.worldImage.frame = self.worldImageView.frame; 
self.worldImage.image = [UIImage imageNamed:@"continents.png"]; 
[maskView addSubview:self.worldImage]; 

[self.view addSubview:maskView]; 

// ...animate worldImage back and forth... 

Обратите внимание, что вместо того, чтобы использовать CAShapeLayer, я просто положить закругленные углы на maskView; так как вам нужна круглая маска, это гораздо более простой трюк. Кроме того, при анимации worldImage рассмотрите использование одного из методов анимации на основе блоков UIView - их гораздо проще обрабатывать для простых вещей, подобных этому.

+0

Я обновил свой код в своем вопросе. Вид не замаскирует изображение. Что я делаю не так? – PoKoBros

+0

Упс! Я забыл, должен установить 'maskView.clipsToBounds = YES'. – ravron

+0

Огромное вам спасибо! Он работает отлично. – PoKoBros

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