Маскирование анимирующего 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
?