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];