CAGradientLayer (グラデーションとフレーム) をアニメーション化しようとしていますが、フレームを 0 までアニメーション化すると、ビューの左上隅まで縮小し、水平方向にアニメーション化したいと考えています。現在、水平方向と垂直方向の両方で 0 にアニメーション化しています。
現在のアニメーションは次のようになります。
私が望むのは、それが何もなくなったときに、水平方向のみに縮小し、ずっと同じ高さを維持することです。
現在使用しているコードは次のとおりです。
- (void)drawRect:(CGRect)rect
{
// Drawing code
if (!gradientLayer) {
gradientLayer = [CAGradientLayer layer];
[gradientLayer setFrame:[self createRectForFrame:rect]];
[gradientLayer setColors:@[(id)fromColor.CGColor, (id)toColor.CGColor]];
[gradientLayer setStartPoint:CGPointMake(fillPct/100, 0.5)];
[gradientLayer setEndPoint:CGPointMake(1.0, 0.5)];
[self.layer addSublayer:gradientLayer];
}
else {
[gradientLayer removeAllAnimations];
[CATransaction begin];
[CATransaction setAnimationDuration:ANIMATION_DURATION];
CGRect newFrame = [self createRectForFrame:rect];
CABasicAnimation *frameAnimation = [CABasicAnimation animationWithKeyPath:@"frame"];
[frameAnimation setDuration:ANIMATION_DURATION];
[frameAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[frameAnimation setFromValue:[NSValue valueWithCGRect:gradientLayer.bounds]];
[frameAnimation setToValue:[NSValue valueWithCGRect:newFrame]];
[frameAnimation setFillMode:kCAFillModeForwards];
[frameAnimation setRemovedOnCompletion:NO];
[gradientLayer setFrame:newFrame];
[gradientLayer addAnimation:frameAnimation forKey:@"frame"];
CGPoint startPoint = CGPointMake(MIN(fillPct/100, 0.99), 0.5);
CABasicAnimation *startPointAnimation = [CABasicAnimation animationWithKeyPath:@"startPoint"];
[startPointAnimation setDuration:ANIMATION_DURATION];
[startPointAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[startPointAnimation setFromValue:[NSValue valueWithCGPoint:gradientLayer.startPoint]];
[startPointAnimation setToValue:[NSValue valueWithCGPoint:startPoint]];
[startPointAnimation setFillMode:kCAFillModeForwards];
[startPointAnimation setRemovedOnCompletion:NO];
[gradientLayer setStartPoint:startPoint];
[gradientLayer addAnimation:startPointAnimation forKey:@"startPoint"];
[CATransaction setCompletionBlock:^{
[self updateInnerLabelTextColor];
}];
[CATransaction commit];
}
[self bringInnerLabelToFront];
}
- (CGRect)createRectForFrame:(CGRect)frame {
if (fillPct == 0)
return CGRectZero;
else if (fillPct >= 100)
return frame;
else
return CGRectMake(frame.origin.x, frame.origin.y, frame.size.width * (fillPct / 100), frame.size.height);
}
fillPct は、バーを埋める値で、0 から 100 の間です。