CAShapeLayer из UIBezierPath мерцает в масштабе анимации

Я сталкиваюсь с проблемой, когда анимация закрытого, заполненного и растеризованного слоя, маскируемого UIBezierPath, иногда прерывает часть одной из дуг во время анимации. Измельчение, похоже, связано с размером сердца. Любая помощь будет принята с благодарностью. Спасибо!

Эти скриншоты находятся на расстоянии одного кадра в анимации масштаба слоя

Я создаю это с помощью CALayer (красный), маскируемого CAShapeLayer из UIBezierPath (heart), все это добавлено в слой MyView

Вот как я создаю слой

// MyLayer.m
+ (UIBezierPath *)bezierHeartShapePathWithWidth:(CGFloat)width atPoint:(CGPoint)center
{
    CGFloat w = width / 2.5f;

    UIBezierPath *path = [[UIBezierPath alloc] init];

    //left arc
    [path addArcWithCenter:CGPointMake(center.x - w/2.f, center.y - w/2.f) radius:(w*sqrt(2.f)/2.f) startAngle:[self toRadians:135.f] endAngle:[self toRadians:-45.f] clockwise:YES];

    //right arc
    [path addArcWithCenter:CGPointMake(center.x + w/2.f, center.y - w/2.f) radius:(w*sqrt(2.f)/2.f) startAngle:[self toRadians:-135.f] endAngle:[self toRadians:45.f] clockwise:YES];

    [path addLineToPoint:CGPointMake(center.x, center.y + w)];
    [path addLineToPoint:CGPointMake(center.x - w, center.y)];

    [path closePath];

    return path;
}

self.bezierPath =[UIBezierPath bezierHeartShapePathWithWidth:self.width atPoint:self.relativeCenter];

Затем я добавляю слой к своему виду и добавляю анимацию.

// MyView.m

// Create a layer to be masked by the heart-shaped layer
maskedLayer = [CALayer layer];
maskedLayer.masksToBounds = YES;
[maskedLayer setFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
maskedLayer.mask  = self.heartLayer;
[self.layer setAnchorPoint:CGPointMake(.5, .5)];
[maskedLayer setAnchorPoint:CGPointMake(.5, .5)];

// Add to the view's root layer
[self.layer addSublayer:maskedLayer];

// Add FB Pop animation for later use    
bounceAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
bounceAnimation.removedOnCompletion = NO;
bounceAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(1,1)];
bounceAnimation.completionBlock = ^(POPAnimation *anim, BOOL completed) {};
// doesn't actually animate until someone taps the view

[maskedLayer pop_addAnimation:bounceAnimation forKey:@"bounceAnimation"];

// Rasterization seems to make the animation way smoother, and my path only gets drawn once. Not sure if all sublayers are rasterized or not.
self.layer.shouldRasterize = YES;
self.layer.rasterizationScale = [[UIScreen mainScreen] scale];

0 ответов

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