CALayer mask Слой анимации - PullRequest
0 голосов
/ 26 января 2019

Я хочу замаскировать CALayer другим слоем, чей кадр я хочу менять при каждом вызове отрисовки, тем самым анимируя.Можно ли изменять кадр слоя маски при каждом вызове отрисовки, а не создавать новый слой маски?

1 Ответ

0 голосов
/ 28 января 2019

Попробуйте следующий код.Этот код будет работать в приложении Какао для MacOS.Пожалуйста, измените классы соответственно, если вы собираетесь использовать Cocoa Touch для iOS.Я надеюсь, что это работает для вас.

// ViewController.h

import

@ interface ViewController: NSViewController {

CALayer * maskLayer;
CALayer * Layer;   

}

// ViewController.m

@ реализация ViewController

- (void) viewDidLoad {

[super viewDidLoad];

maskLayer = [CALayer layer];
Layer = [CALayer layer];

Layer.backgroundColor = [[NSColor blueColor] CGColor];
Layer.frame = CGRectMake(20, 20, 720, 900);
Layer.contents = [NSImage imageNamed:@"bg1"];

maskLayer.frame = CGRectMake(20, 20, 720, 900);
maskLayer.opacity = 0.5;
[maskLayer mask];

maskLayer.contents = [NSImage imageNamed:@"bg"];


[self.view.layer addSublayer:Layer];
[self.view.layer addSublayer:maskLayer];

[self maskLayerAnimation];

}

- (void) maskLayerAnimation {

[CATransaction begin];
CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeAnim.fromValue = [NSNumber numberWithFloat:1.0];
fadeAnim.toValue = [NSNumber numberWithFloat:0.0];
fadeAnim.duration = 5.0;


[CATransaction setCompletionBlock:^{
    NSLog(@"animation completed");
    maskLayer.frame = CGRectMake(20, 20, 720, 700);
    maskLayer.contents = [NSImage imageNamed:@"bg2"];
}];;

[maskLayer addAnimation:fadeAnim forKey:@"opacity"];
[CATransaction commit];

}

...