CAShapeLayer UIBezierPath

CAGradientLayer,CAShapeLayer及UIBezierPath实现环形彩色进度条 结合CAGradientLayer,CAShapeLayer及UIBezierPath实现环形彩色进度条 CAGradientLayer: 渐变色 CAShapeLayer: 提供显示图层渲染需要结合UIBezierPath UIBezierPath: 提供路径 CAShapeLayer: 1, CAShapeLayer继承自CALayer,可使用CALayer的所有属性 2, 阅读详情

CAShapeLayer

我用了两个 UIBezierPath 和 CAShapeLayer 在之前。但几乎每一次与填充对象一起包含在用颜色对路径内。但我希望这次来填充的颜色以外的对象所包含的UIBezierPath 。

我只是写了,并运行下面的简单代码试图让自己熟悉 fillRule 属性:

CAShapeLayer *myLayer = (CAShapeLayer*) self.layer; //size: 320 X 480
UIBezierPath *testPath = [UIBezierPath bezierPathWithOvalInRect:(CGRect){{100, 100}, 100, 100}]; //a simple circle
myLayer.fillRule = kCAFillRuleNonZero; // have tried this as well: kCAFillRuleEvenOdd;
myLayer.path = testPath.CGPath;
myLayer.fillColor = [UIColor whiteColor].CGColor;

但尽管如此内部填充颜色。我想要找出什么是,如何可以在路径外的颜色?如果我使用的 fillRule 错在这里,我想知道是否有其他可以实现这一目标的方法。先谢谢了。

解决方法 1:

主要的问题是你不能真的填补以外的一个形状,因为没有任何泛型方法定义什么意思。你需要做什么是形状的首先绘制路径围绕您,"外部",然后添加圈子作为子路径。你怎么这取决于您想要使用的填充规则上。EvenOdd 是最简单的方法:

CAShapeLayer *myLayer = (CAShapeLayer*) self.layer;
UIBezierPath *testPath = [UIBezierPath bezierPathWithRect:self.bounds];
[testPath appendPath:[UIBezierPath bezierPathWithOvalInRect:(CGRect){{100, 100}, 100, 100}]];
myLayer.fillRule = kCAFillRuleEvenOdd;
myLayer.path = testPath.CGPath;
myLayer.fillColor = [UIColor whiteColor].CGColor;

非零是有点难度,因为你要强制要将反时针方向,不是为 UIBezierPath 的方便方法中的大多数选项的路径:

CAShapeLayer *myLayer = (CAShapeLayer*) self.layer;
UIBezierPath *testPath = [UIBezierPath bezierPathWithRect:self.bounds];
UIBezierPath *counterClockwise = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 100) radius:100 startAngle:0 endAngle:M_PI clockwise:NO];
[counterClockwise appendPath:[UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 100) radius:100 startAngle:M_PI endAngle:0 clockwise:NO]];
[testPath appendPath:counterClockwise];
myLayer.fillRule = kCAFillRuleNonZero;
myLayer.path = testPath.CGPath;
myLayer.fillColor = [UIColor redColor].CGColor;

取决于你如何构建您的实际路径它可能不有所作为无论哪种方式。

如果你已经没见过的缠绕规则文件有一些不错的图我认为很有帮助。


之前讲过CALayer动画相关知识,再来看看更加复杂的CAShapeLayer相关的动画知识.

普通CALayer在被初始化时是需要给一个frame值的,这个frame值一般都与给定view的bounds值一致,它本身是有形状的,而且是矩形.

CAShapeLayer在初始化时也需要给一个frame值,但是,它本身没有形状,它的形状来源于你给定的一个path,然后它去取CGPath值,它与CALayer有着很大的区别

 

 

CAShapeLayer有着几点很重要:

1. 它依附于一个给定的path,必须给与path,而且,即使path不完整也会自动首尾相接

2. strokeStart以及strokeEnd代表着在这个path中所占用的百分比

3. CAShapeLayer动画仅仅限于沿着边缘的动画效果,它实现不了填充效果

 

 

以下给出如何使用CAShapeLayer

    // 创建一个view
    UIView *showView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    [self.view addSubview:showView];
    showView.backgroundColor = [UIColor redColor];
    showView.alpha = 0.5;

 

    // 贝塞尔曲线(创建一个圆)
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100 / 2.f, 100 / 2.f)
                                                        radius:100 / 2.f
                                                    startAngle:0
                                                      endAngle:M_PI * 2
                                                     clockwise:YES];

 

    // 创建一个shapeLayer
    CAShapeLayer *layer = [CAShapeLayer layer];
    layer.frame         = showView.bounds;                // 与showView的frame一致
    layer.strokeColor   = [UIColor greenColor].CGColor;   // 边缘线的颜色
    layer.fillColor     = [UIColor clearColor].CGColor;   // 闭环填充的颜色
    layer.lineCap       = kCALineCapSquare;               // 边缘线的类型
    layer.path          = path.CGPath;                    // 从贝塞尔曲线获取到形状
    layer.lineWidth     = 4.0f;                           // 线条宽度
    layer.strokeStart   = 0.0f;
    layer.strokeEnd     = 0.1f;

 

    // 将layer添加进图层
    [showView.layer addSublayer:layer];

 

    // 3s后执行动画操作(直接赋值就能产生动画效果)
    [[GCDQueue mainQueue] execute:^{
        layer.speed       = 0.1;
        layer.strokeStart = 0.5;
        layer.strokeEnd   = 0.9f;
        layer.lineWidth   = 1.0f;
    } afterDelay:NSEC_PER_SEC * 3];

 

    // 给这个layer添加动画效果
    CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    pathAnimation.duration = 1.0;
    pathAnimation.fromValue = [NSNumber numberWithFloat:0.5f];
    pathAnimation.toValue = [NSNumber numberWithFloat:0.8f];
    [layer addAnimation:pathAnimation forKey:nil]; 

 

 

 

    // 创建一个gradientLayer
    CAGradientLayer *gradientLayer =  [CAGradientLayer layer];
    gradientLayer.frame = showView.bounds;
    [gradientLayer setColors:[NSArray arrayWithObjects:
                               (id)[[UIColor redColor] CGColor],
                               (id)[[UIColor yellowColor] CGColor], nil]];
    [gradientLayer setLocations:@[@0.5,@0.9,@1]];
    [gradientLayer setStartPoint:CGPointMake(0.5, 1)];
    [gradientLayer setEndPoint:CGPointMake(0.5, 0)];

 

 

 

附录:

TestView.h

 

复制代码
#import <UIKit/UIKit.h>

@interface TestView : UIView

{
    
    CAShapeLayer *layer;
    
}

- (void)strokeStart:(CGFloat)value;
- (void)strokeEnd:(CGFloat)value;

@end
复制代码

 

TestView.m

复制代码
#import "TestView.h"

@implementation TestView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        layer = [CAShapeLayer layer];
        layer.frame = self.bounds;
        
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.frame.size.height / 2.0f,
                                                                               self.frame.size.height / 2.0f)
                                                            radius:self.frame.size.height / 2.f
                                                        startAngle:0
                                                          endAngle:M_PI * 2
                                                         clockwise:YES];
        
        layer.strokeColor   = [UIColor greenColor].CGColor;   // 边缘线的颜色
        layer.fillColor     = [UIColor clearColor].CGColor;   // 闭环填充的颜色
        layer.lineCap       = kCALineCapSquare;               // 边缘线的类型
        layer.path          = path.CGPath;                    // 从贝塞尔曲线获取到形状
        layer.lineWidth     = 1.0f;                           // 线条宽度
        layer.strokeStart   = 0.0f;
        layer.strokeEnd     = 0.0f;
        
        [self.layer addSublayer:layer];
    }
    return self;
}

- (void)strokeStart:(CGFloat)value
{
    layer.speed = 1;
    layer.strokeStart = value;
}

- (void)strokeEnd:(CGFloat)value
{
    layer.speed = 1;
    layer.strokeEnd = value;
}

@end

CAShapeLayer 贝塞尔曲线 不圆   

> self.circleLayer.path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(size.width/2, size.height/2) radius:size.width/2 startAngle:-M_PI endAngle:M_PI clockwise:YES].CGPath; self.circleLayer.fillColor = [UIColor clearColor].CGColor; self.circleLayer.strokeColor = self.color.CGColor; self.circleLayer.lineWidth = 1.0f; self.circleLayer.hidden = YES; 如上,circleLayer是CAShapeLayer,添加贝塞尔曲线的圆路径后展现出来并不圆

给CAShapeLayer设置边框颜色为透明色   

给CAShapeLayer设置边框颜色为透明色得时候,不起作用,具体使用代码如下:

CAShapeLayer *layer = [CAShapeLayer layer];

    layer.path = path.CGPath;

    

    layer.fillColor = [[UIColor redColor] CGColor];

    layer.strokeColor = [[UIColor clearColor] CGColor];

    layer.lineWidth = spacing*40;

    layer.borderColor = [UIColor clearColor].CGColor;

    layer.borderWidth = spacing*40;

    layer.masksToBounds = YES;

    

    [path stroke];

    [path fill];

我使用 UIBezierPath 绘制Path 然后截取不规则的图形,但是我要将多个不规则图形拼凑起来的时候  需要给这些不规则图形设置间距    我使用的方法如下:

    CAShapeLayer *layer = [CAShapeLayer layer];

    layer.frame = self.bounds;

    layer.path = path.CGPath;    

    layer.lineWidth = spacing/2.0;

    layer.fillColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor;

    layer.strokeColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1].CGColor;

    self.layer.mask = layer;

   

【CAShapeLayer & UIBezierPath】边框设置(iOS开发篇) UIView*View = [[UIViewalloc] initWithFrame:(CGRectMake(0, 0, 100, 100))]; View.center = self.view.center; [self.view addSubview:View]; View.backgroundColor = [UIColorgrayColor]; 一  实线边框 View.lay... 阅读详情

相关推荐

利用UIBezierPath和CAShapeLayer实现的镂空及遮罩效果。

利用UIBezierPath和CAShapeLayer实现的镂空及遮罩效果。

通过 CAShapeLayer 为 View 添加边框

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34198881的博客 329

从理论到实践:利用FilterSolutions高效设计7阶椭圆低通滤波器

本文详细介绍了如何利用FilterSolutions软件高效设计7阶椭圆低通滤波器。文章从理论入手,对比了巴特沃斯、切比雪夫等经典滤波器特性,阐述了在要求高衰减陡度(如62dB抑制)和严格通带波纹(0.2dB)时,椭圆滤波器是最优选择。通过分步实战教程,指导读者完成从软件参数设置、性能验证到实际电路布局与调试的全过程,助力射频与高速数字信号处理工程师将理论转化为可靠设计。

jupi8的博客 559

利用CAShapeLayer和UIBezierPath实现中空透明圆,圆外填充色

CAShapeLayer和UIBezierPath结合,调用CAShapeLayer的path属性,然后再实现CAShapeLayer的fillcolor属性,便可以在UIBezierPath所绘制的路径内填充颜色。顺着这个思路,来实现一下:

Carl-w 7628

思科模拟器CIsco Packet Tracer利用三层交换机实现VLAN间路由

版权声明:如果对大家有帮助,大家可以自行转载的。 1.技术原理: 三层交换机具备网络层的功能,实现 VLAN 相互访问的原理是:利用三层交换机的路由功能,通过识别数据包的 IP 地址,查找路由表进行选路转发,三层交换机利用直连路由可以实现不同 VLAN 之间的相互访问。三层交换机给接口配置 IP 地址。采用 SVI(交换虚拟接口)的方式实现 VLAN 间互连。SVI 是指为交换机中的VLAN 创建...

qq_37992321的博客 1万+

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

很多情况下是没有现成的VS Code Server程序的,需要手动下载。记住上面的Commit ID,可以通过下面的链接下载 vscode-server-linux-x64.tar.gz。然后将vscode-server-linux-x64.tar.gz上传在服务器上的$HOME/.vscode-server/bin文件夹中,解压。在wsl中下载不了 vscode 的核心。运行下面两行命令,建立空的$HOME/.vscode-server/bin文件夹。重新运行 wsl与vs的链接即可。

点云算法工程师 3790

「OC」CAShapeLayer和UIBezierPath —— 抽屉视图之中圆角cell的实现

上次我们学习了CALayer的相关知识,但好像忘记了我一开始学习CALayer是为了实现cell之中的圆角cell,那么了解完相关的前置知识。

aa2002aa的博客 1322

Python_构建同花顺问财智能选股API服务

本文详细介绍了如何使用Python构建同花顺问财智能选股API服务,涵盖从环境准备、核心API开发到高级功能扩展的全过程。通过Flask框架和pywencai库,开发者可以快速搭建稳定可靠的选股接口,实现自动化股票筛选与交易系统集成,提升量化投资效率。

weixin_30596343的博客 330

CAShapeLayer的使用

CAShapeLayer的使用之前在项目中,经常会需要设置圆角的一些属性或者一些动画,经常会涉及到layer层的东西,而如果需要我们自定义图形的话,那么我们经常就会用到CAShapeLayer来创建了.而且经常与其一起搭配使用的是UIBezierPath.这两天比较闲,就写了这篇博客来记录下自己写的一个小Demo,虽然使用起来很简单,但是偶尔想不起来如何设置的话,也是一件很纠结的事情…如果我们要绘制

mumubumaopao的博客 3667

麒麟系统下的多媒体革命:VLC在kylinV10上的性能优化与调试技巧

本文详细介绍了在麒麟kylinV10系统上优化VLC多媒体播放性能的实战技巧,特别针对飞腾FT-2000/4硬件平台。从源码编译调优到硬件加速配置,提供全面的性能提升方案,帮助开发者在国产操作系统上构建高效媒体播放环境。

weixin_29168675的博客 457

微信浏览器input[file]拍照点确认后强刷新解决

微信浏览器input强刷新,input h5强刷新,微信浏览器上传图片后刷新,h5表单强刷新,h5调用拍照后返回首页,h5调用拍照后刷新,微信浏览器强制刷新,iOS上微信浏览器input强刷新,iOS上微信浏览器上传图片后强刷新,ios微信浏览器上传图片后页面刷数据,h5在ios浏览器闪频,h5在ios微信打开时强制刷新,ios手机上调用相机后页面刷新,ios手机上调用相机后页面后重置,ios拍照后刷新,ios拍照完页面大刷新

江拥羡橙的博客 1349

颜色渐变的弧度条

在Github上看到一些进度条的功能,都是通过Core Graph来实现。无所谓正确与否,但是开发效率明显就差很多了,而且运行效率还是值得考究的。其实使用苹果提供的Core Animation能够非常简单和方便的实现环形进度条效果,而且还可以高效的保证动画效果,无论是前进还是后退(语言水平比较有限,就多用代码说话)。 1、先来一个结果 80%的状态: 99%的

骁驰的技术和产品专栏 1124

大学计算 - NumPy库的矩阵运算 实训答案

本文介绍了三个NumPy矩阵操作的实验练习。第一关练习ndarray类型操作,包括矩阵构造、元素平方和计算、矩阵乘积运算和逆矩阵行列式计算;第二关针对matrix类型,涉及绝对值最大值获取、特定矩阵乘积运算和转置矩阵特征值计算;第三关实现Moore-Penrose伪逆矩阵计算,并与NumPy内置pinv函数结果比较误差。实验涵盖了NumPy核心矩阵操作,展示了从基础运算到高级矩阵分解的应用,帮助掌握科学计算中的矩阵处理技巧。

2403_89314916的博客 310

CAShapeLayer 和UIBezierPath

CAShapeLayer 是 CALayer 的子类,但是比 CALayer 更灵活,可以画出各种图形,当然,你也可以使用其他方式来画,随你。 杂谈 在 CAShapeLayer 中,也可以像 CALayer 一样指定它的 frame 来画,就像这样: 1 2 3 4 5 letlayer=CAShapeLayer() laye...

136

9篇3章3节:FAERS数据库公共仪表板搜索功能操作与解析

FAERS(FDA不良事件报告系统)公共仪表板是一个强大的工具,用于查询和分析药物及生物制品的不良事件数据。通过该仪表板,用户可以按药品或不良反应进行搜索,查看报告数量、事件类型及时间分布,从而辅助药物安全性分析和科研研究。本文重点介绍仪表板的搜索功能,包括按产品和按不良反应查询的操作步骤、筛选与多维数据分析方法,以及关键概念的解释,帮助用户科学、理性地使用FAERS数据,提升用药决策的准确性和安全性。

MD Code 1585

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

UIView UIBezierPath CGPath CAShapeLayer 等的关系

UIView UIBezierPath CGPath CAShapeLayer 等的关系 前言:推荐使用 Dash 这个软件来查看 API 文档,比 xcode 自带的 API 文档方便太多 这些东西的关系,我到现在才整明白,分享下: 需求: 比如,我们需要在一个 ViewController 的 view 中添加一个圆形的 UIView,如何做呢? 你需要知道的 UIBezierPath ...

学习笔记 737

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ios CAShapeLayer和UIBezierPath

CAShapeLayer继承CALayer,因此,可使用CALayer的所有属性,但是,CAShapelayer需要和贝塞尔曲线配合使用才有意义。 现在简单的画一个圆形 - (void)test { CAShapeLayer *layer = [CAShapeLayer layer]; // 指定frame,只是为了设置宽度和高度 layer.frame = C

kelin_Li的博客 845

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

使用UIBezierPath和CAShapeLayer画各种图形

一、使用CAShapeLayer实现复杂的View的遮罩效果 1.1、案例演示 在聊天界面,发送图片的时候,会有一个三角的指向效果,指向这张图片的发送者。服务端返回给我们的图片只是一张矩形的图片,我们如何把一张矩形的图片或者View,加上一层自定义遮罩效果,就是本文要讲的内容。效果演示如下:第一张是一个View的遮罩效果,第二张是UIImageView的遮罩效果。 1.2、实现机制 在...

小天空的博客 1831

UIBezierPath + CAShapeLayer的简单使用

先看看UIBezierPath的基础概念 UIBezierPath是CGPathRef数据类型的封装。使用UIBezierPath可以创建基于矢量的路径,此类是Core Graphics框架关于路径的封装。使用此类可以定义简单的形状,如椭圆、矩形或者有多个直线和曲线段组成的形状等所以在这里我想到的是用UIBezierPath进行绘图实现.h(先引入QuartzCore/QuartzCore

Raymon、浅忆。 726

CAShapeLayer和UIBezierPath

一:贝塞尔曲线 UIBezierPath使用UIBezierPath类可以创建基于矢量的路径,这个类再UIKit中。此类是Core Graphics框架关于path的一个封装。使用此类可以定义简单的形状,如椭圆或者矩形,或者有多个直线和曲线段组成的形状。1、UIBezierPath基础UIBezierPath对象是CGPathRef数据类型的封装。path如果是基于矢量形状的,都是直线和曲线段去创建

xiaoxiaobukuang的专栏 2952

CAShapeLayer与UIBezierPath

使用CAShapeLayer与UIBezierPath可以实现不在view的drawRect方法中就画出一些想要的图形 步骤: 1、新建UIBezierPath对象bezierPath 2、新建CAShapeLayer对象caShapeLayer 3、将bezierPath的CGPath赋值给caShapeLayer的path,即caShapeLayer.pat

小哥哥的博客 5458

IOS-CAShapeLayer与UIBezierPath的基本用法

##1.CAShapeLayer CAShapeLayer顾名思义,继承于CALayer。 每个CAShapeLayer对象都代表着将要被渲染到屏幕上的一个任意的形状(shape)。具体的形状由其path(类型为CGPathRef)属性指定。 普通的CALayer是矩形,所以需要frame属性。CAShapeLayer初始化时也需要指定frame值,但 它本身没有形状,它的形状来源于其属性path

Arnly的博客 3346

CAShapeLayer + UIBezierPath

UIBezierPath:UIBezierPath是在UIKit中的一个类,继承于NSObject,可以创建基于矢量的路径。使用此类可以定义常见的圆形、多边形等形状。我们使用直线、弧(arc)来创建复杂的曲线形状。每一个直线段或者曲线段的结束的地方是下一个的开始的地方。每一个连接的直线或者曲线段的集合成为subpath。一个UIBezierPath对象定义一个完整的路径包括一个或者多个su...

weixin_30354675的博客 123

iOS关于CAShapeLayer与UIBezierPath的知识内容

使用CAShapeLayer与UIBezierPath可以实现不在view的drawRect方法中就画出一些想要的图形 。 1:UIBezierPath: UIBezierPath是在 UIKit 中的一个类,继承于NSObject,可以创建基于矢量的路径.此类是Core Graphics框架关于path的一个OC封装。使用此类可以定义常见的圆形、多边形等形状 。我们使用直线、弧(arc)来

CSND_GO 522

使用CAShapeLayer与UIBezierPath

使用CAShapeLayer与UIBezierPath可以实现不在view的drawRect方法中就画出一些想要的图形 。 1.背景知识: UIBezierPath: UIBezierPath是在 UIKit 中的一个类,继承于NSObject,可以创建基于矢量的路径.此类是Core Graphics框架关于path的一个OC封装。使用此类可以定义常见的圆形、多边形等形状 。我们

NightWish 7853
上一篇: Python 面向对象 设计详解
下一篇: iOS 知识点总结 笔记总结
FirstBloodFB
博客等级 码龄12年 7粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值