IOS CAShapeLayer CAGradientLayer UIBezierPath 使用实例

本文演示了如何在路径动画的基础上,通过设置渐变层实现颜色渐变效果,并详细解释了`setLocations`, `setStartPoint`, `setEndPoint`等关键属性的作用。通过实例代码展示了如何将渐变层添加至视图,最终得到动态变化的视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CGRect rect = CGRectMake(100, 100, 100, 100);

    UIView * bgView = [[UIView alloc]initWithFrame:rect];

    bgView.backgroundColor = [UIColor grayColor];

    [self.view addSubview:bgView];

    CAShapeLayer * trackLayer = [CAShapeLayer layer];

    trackLayer.frame = bgView.bounds;

    [bgView.layer addSublayer:trackLayer];

    trackLayer.fillColor = [[UIColor blackColor] CGColor];//填充颜色,这里应该是  clearColor

    trackLayer.strokeColor = [[UIColor redColor] CGColor];//边框颜色

    trackLayer.opacity = 0.5;

    trackLayer.lineCap = kCALineCapRound;

    trackLayer.lineWidth = 4.0;  // 红色的边框宽度

    UIBezierPath * path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(5050) radius:48 startAngle:degreesToRadians(-210) endAngle:degreesToRadians(30) clockwise:YES];

//角度是从 -210到30度,具体可以看如下图所示

    trackLayer.path = [path CGPath];

 运行后的结果如下

 

 

基于以上的代码,下面添加渐变的效果

   CALayer * gradinetLayer = [CALayer layer];

    CAGradientLayer * gradLayer1 = [CAGradientLayer layer];

    gradLayer1.frame = CGRectMake(0, 0, bgView.frame.size.width/2, bgView.frame.size.height);

    [gradLayer1 setColors:[NSArray arrayWithObjects:(id)[[UIColor redColor] CGColor],(id)[UIColorFromRGB(0xfde802) CGColor], nil]];

    [gradLayer1 setLocations:@[@0.5,@0.9,@1 ]];

    [gradLayer1 setStartPoint:CGPointMake(0.51)];

    [gradLayer1 setEndPoint:CGPointMake(0.5, 0)];

    [gradinetLayer addSublayer:gradLayer1];

 

    CAGradientLayer * gradLayer2 = [CAGradientLayer layer];

    gradLayer2.frame = CGRectMake(bgView.frame.size.width/2, 0, bgView.frame.size.width/2, bgView.frame.size.height);

    [gradLayer2 setColors:[NSArray arrayWithObjects:(id)[UIColorFromRGB(0xfde802) CGColor],(id)[[UIColor blueColor] CGColor], nil]];

    [gradLayer2 setStartPoint:CGPointMake(0.50)];

    [gradLayer2 setEndPoint:CGPointMake(0.5, 1)];

    [gradinetLayer addSublayer:gradLayer2];

 

    //[gradinetLayer setMask:trackLayer];

 

    [bgView.layer addSublayer:gradinetLayer];

 

本文转自  张江论坛   转载请注明 http://www.999dh.net/home.php?mod=space&uid=1&do=blog&quickforward=1&id=328

以上的代码运行后得到的结果如下:

解释如下:

 

setLocations  理论上来说,是设置 colors的显示区域的(这里还未弄清楚原理)

setStartPoint 是颜色的开始渐变的开始点,默认的是(0,0)也就是左上角 

setEndPoint 是颜色的停止渐变的点,默认的是(1,1)

如果按默认的来,gradLayer1 的颜色渐变应该是从左上角由redcolor渐变到右下角(颜色为 0xfde802)

而代码中设置的 startPoint为(0.5,1),指的是在x轴中间,y轴底部;endPoint为(0.5,0)指的是在x轴中间,y轴顶部。

 

最后将代码[gradinetLayer setMask:trackLayer]; 注释去掉,得到如下的运行结果

这里主要的作用就是 setMask的功劳,但是为什么trackLayer的strokeColor没有生效,这里也不是很清楚。(哎,不懂的太多了哎)

转载于:https://www.cnblogs.com/rollrock/p/3832997.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值