• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 仅水平动画 CAGradientLayer

[复制链接]
菜鸟教程小白 发表于 2022-12-12 09:32:38 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

这是动画当前的样子:

Animating CAGradientLayer

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

这是我目前使用的代码:

- (void)drawRectCGRect)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)createRectForFrameCGRect)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 之间。



Best Answer-推荐答案


问题出在这一行:

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 setFrameCGRect){{150.0f, 240.0f}, 150.0f, 20.0f}];

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

[frameAnimation setToValue:[NSValue valueWithCGRectCGRect){{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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap