Маскирование анимирующего CALayer для использования в CAReplicatorLayer для создания эффекта калейдоскопа

Я пытаюсь создать калейдоскоп в iOS (я знаю, что есть CIKaleidoscope фильтр, но он не дает мне того эффекта, который я ищу, так что я надеялся накатить свой). Мне удалось получить эффект с помощью неподвижного изображения, используя CALayer, маскируя его треугольником CAShapeLayer затем воспроизвести его с CAReplicatorLayer, Я сейчас пытаюсь оживить исходное изображение в CALayer дать ему некоторое движение. Я создаю CALayer и анимация использует следующий код:

UIImage *pattern = [UIImage imageNamed:@"pattern.jpg"];
CALayer *aLayer = [CALayer layer];
aLayer.bounds = CGRectMake(0, 0, pattern.size.width, pattern.size.height);
aLayer.position = CGPointMake(self.view.bounds.size.width/2.0f,
                              self.view.bounds.size.height/2.0f);
aLayer.contents = (id)pattern.CGImage;

CABasicAnimation* panningAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
panningAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
panningAnimation.toValue   = [NSValue valueWithCGPoint:CGPointMake(400, 400)];
panningAnimation.duration = 5.0;

[aLayer addAnimation:panningAnimation forKey:@"position"];

[self.view.layer addSublayer:aLayer];

Затем я создаю треугольник для маски:

CGMutablePathRef path = CGPathCreateMutable ();
CGPathMoveToPoint (path, NULL, 0, 0);
CGPathAddLineToPoint (path, NULL, 57.735, 0);
CGPathAddLineToPoint (path, NULL, 0, 100);
CGPathAddLineToPoint (path, NULL, 0, 0);
CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init];
[shapeLayer setPath: path];

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

Добавление маски к слою вида приводит к тому, что я следую за шаблоном, проходящим через маску в треугольнике:

[self.view.layer setMask:shapeLayer];

но я не могу легко воспроизвести это, используя CAReplicatorLayer, Есть ли способ, которым я могу замаскировать CALayer но держать маску на месте относительно рамки вида, а не рамки анимационного слоя? Или есть какой-нибудь способ, которым я могу захватить анимационное изображение вида, чтобы я мог использовать его в CAReplicatorLayer?

0 ответов

Другие вопросы по тегам