gpt4 book ai didi

ios - 仅水平动画 CAGradientLayer

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:06 24 4
gpt4 key购买 nike

我正在尝试为 CAGradientLayer(渐变和框架)设置动画,当我将框架设置为 0 时,它会缩小到 View 的左上角,我希望它只是动画化水平地。现在它的水平和垂直动画都为 0。

这是动画当前的样子:

Animating CAGradientLayer

我想要的是当它下降到零时,仅水平收缩,并始终保持相同的高度。

这是我目前使用的代码:

- (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 之间。

最佳答案

问题是这一行:

CGPoint startPoint = CGPointMake(MIN(fillPct/100, 0.99), 0.5);

如果将其更改为:

CGPoint startPoint = CGPointMake(0.0, 0.5);

它会如您所愿地工作——不会在拐角处收缩。

或者,如果您希望保留当前代码,也可以更改此值:

CGPoint startPoint = CGPointMake(MIN(fillPct/100, 0.0), 0.5);

刚刚测试过;它水平动画。希望这会有所帮助。

更新 1:

评论中提到的问题我确实没有遇到过;但是,我决定再看一遍。由于您没有为 rect 提供任何任意值以及您一遍又一遍地调用它的方式,我想出了我自己的并再次测试它。

我用这个值设置了 gradientLayer:

[gradientLayer setFrame:(CGRect){{150.0f, 240.0f}, 150.0f, 20.0f}];

在第一个 CABasicAnimation 中,出于测试目的,我更改了这个:

[frameAnimation setToValue:[NSValue valueWithCGRect:(CGRect){{150.0f, 240.0f}, 0.0f, 20.0f}]];

如您所见,它与图层的矩形完全相同,只是宽度为 0.0f。想象一下,这会导致宽度为 0。

以上是否有效?是的。

以上是否按照您想要的方式工作?没有。

原因是这会导致框架均匀收缩 - 这不是您想要的。

因此,在创建 gradientLayer 时添加:

gradientLayer.anchorPoint = (CGPoint){0.0f, 0.5f};

再次,我对其进行了测试,在撰写本文时它正在我面前运行。顺便看看挺好玩的。

再次希望这对您有所帮助。

关于ios - 仅水平动画 CAGradientLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23281961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com