2016-03-06 5 views
1

Я хотел бы реализовать анимации перехода между двумя UIView в зависимости от материала конструкции, как показано на скриншоте ниже (первая часть только анимации):Добавление шкалы анимации для CAShapeLayer

enter image description here

Но я бы как сделать его более реалистичным с применением анимированной маски для UIView. Вот код, который я разработал:

- (IBAction)onButtonTapped:(UIButton *)sender 
{ 
    // 1. make a hole in self.view to make visible another view 
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRect:self.view.bounds]; 
    [maskPath appendPath:[UIBezierPath bezierPathWithArcCenter:sender.center 
                 radius:sender.frame.size.width/2.0f 
                startAngle:0.0f 
                 endAngle:2.0f*M_PI 
                clockwise:NO]]; 

    CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
    maskLayer.fillRule = kCAFillRuleEvenOdd; 
    maskLayer.fillColor = [UIColor blackColor].CGColor; 
    maskLayer.path = maskPath.CGPath; 

    // 2. add scale animation for resizing hole 
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    animation.fromValue = [NSValue valueWithCGRect:sender.frame]; 
    animation.toValue = [NSValue valueWithCGRect:self.view.bounds]; 
    animation.duration = 3.0f; 
    [maskLayer addAnimation:animation forKey:@"scaleAnimation"]; 

    self.view.layer.mask = maskLayer; 
} 

Моя идея добавляет «дыру» в модальный UIView, а затем масштабирует остроумие.

Проблема в том, что она не работает должным образом. Первая часть кода делает отверстие хорошо. Но масштабирование анимации дыры не работает вообще.

ответ

0

Вы не можете добавить анимацию к слою, если слой не находится в дереве слоев какого-либо окна. Вам необходимо сделать что-то в этом порядке:

self.view.layer.mask = maskLayer; 
[CATransaction flush]; 
[maskLayer addAnimation:animation forKey:@"scaleAnimation"]; 
+0

По-прежнему не работает, как показано на скриншоте выше – Sergio