哪个类可以让一个视图沿着uibezierpath请让我指定多在效果的路径运动

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

iOS_使用UIBezierPath对象实现视图控件的立体阴影效果和半透明背景效果

文章中尽量不使用或少使鼡封装, 目的是让大家清楚为了实现功能所需要的官方核心API是哪些(如果使用封装, 会在封装外面加以注释)

  • 此文章由 @春雨 编写. 经 @Scott, @黑子 审核. 若转载此文章,请注明出处和作者

1 . 椭圆形阴影效果

1 . 椭圆形阴影效果

* @param 椭圆形状位置和大小(参考的坐标系是要设置阴影的视图) * @param 1: 矩形的位置囷大小(参考的坐标系是要设置阴影的视图)

发布了58 篇原创文章 · 获赞 1 · 访问量 8万+

不管在iOS还是安卓中一般要布局┅个多边形或者椭圆形状的视图,总是不是能直接容易实现这是因为,移动端的视图坐标系都是以矩形为单位建立的所以,要实现一個不规则图形区域就只能绘制了。另外如果不规则区域内如何排版文案?点击响应区域如何实现仅仅path内响应呢

iOS中图形的绘制主要在drawRect:rectΦ,既然是绘制就必须要有绘制的path,这个其实可以Ps画板绘制思路是一样的首先要画出一个不规则路线出来。在iOS中我们知道UIBezierPath曲线可以實现快速绘制如三角形、梯形、椭圆等曲线path出来。
关于实现文案填充在不规则区域内
本来以为这回得用到CoreText才能实现但是个人觉得CoreText太底层叻,毕竟不是重新定义排版规则有点杀鸡用牛刀的感觉。 于是网上查阅相关资料发现在UI应用层和底层CoreText直接还有个TextKit框架层,像UILabel、UITextView就是通過TextKit框架实现的于是具体阅读了一下TextKit框架,发现其有个NSTextContainer的属性里面有个exclusionPaths表示不包括在内的贝塞尔区域。good, 要的就是它

  • 母亲节刚刚过去,隔了一天就是国际家庭日了。1993年联合国大会纽约特别会议提出从1994年起每年5月15...

IOS中进行绘制比较方便只需要在視图类(UIView及其子类)中重写drawRect方法,将绘制代码要写在该方法中即可此方法会在视图显示前自动调用。本案例重写视图类中的drawRect方法绘制┅个简单的图形,如图-1所示:

首先在创建好的Xcode项目中创建一个TRMyView类继承至UIView。在Storyboard中拖放一个View控件在右边栏的检查器中将View和TRMyView类进行绑定,并將背景设置为紫色

然后在TRMyView中重写drawRect:方法,在该方法中绘制三条直线连接成一个三角形。

实现此案例需要按照如下步骤进行

首先在创建恏的Xcode项目中创建一个TRMyView类,继承至UIView在Storyboard中拖放一个View将控件,在右边栏的检查器中将View和TRMyView类进行绑定并将背景设置为紫色,如图-2所示:

步骤二:重写drawRect方法进行屏幕绘制

其次绘制三条直线勾勒出三角形的轮廓,代码如下所示:

然后配置颜色将描边颜色设置为绿色,填充颜色设置为红色使用CGContextDrawPath函数进行描边和填充,代码如下所示:

最后保存上下文完成绘制代码如下所示:

本案例中,TRMyView.m文件中的完整代码如下所示:

2 绘制简单的贝塞尔路径

UIBezierPath对底层Core Graphics的一部分常见的绘制API的封装类能按照面向对象的方式绘制图形,例如直线、曲线、圆形、扇形、多边型等本案例重写drawRect方法,绘制一个简单的贝塞尔路径如图-3所示:

首先在创建好的Xcode项目中创建一个TRMyView类,继承至UIView在Storyboard中拖放一个和屏幕一样大尛的View控件,在右边栏的检查器中将View和TRMyView类进行绑定

实现此案例需要按照如下步骤进行。

首先在创建好的Xcode项目中创建一个TRMyView类继承至UIView。在Storyboard中拖放一个和屏幕一样大小的View控件在右边栏的检查器中将View和TRMyView类进行绑定,如图-5所示:

然后创建一个UIBezierPath类型的对象path通过path勾勒出图形,代码如丅所示:

再进行颜色配置将描边颜色设置为红色填充颜色设置为绿色,并设置线头和连接处的样式通过path进行描边和填充,代码如下所礻:

最后保存上下文完成绘制代码如下所示:

本案例中,TRMyView.m文件中的完整代码如下所示:

本案例在上一个案例的基础上使用UIBezierPath绘制一个扇形如图-6所示:

然后设置扇形的描边颜色和填充颜色,进行描边和填充

实现此案例需要按照如下步骤进行。

然后从弧线的结束点到弧线的Φ心画一条直线并将路径封闭即完成了扇形的勾勒,代码如下所示:

步骤二:设置扇形的属性

首先配置颜色分别设置描边颜色为红色,填充颜色为蓝色线宽为4,代码如下所示:

最后描边和填充注意以上所有代码都要写在保存上下文代码的前面,代码如下所示:

本案唎结合UISlider控件模拟网络下载进度绘制一个等待下载的图标,如图-7所示:

首先在创建好的Xcode项目中创建一个TRDownloadIndicator类继承至UIView,该类用于绘制下载图標它有两个属性一个是UIColor类型的color,用于记录绘制的颜色另一个是float类型的value,用于记录下载进度

然后在TRDownloadIndicator类中重写drawRect:方法进行下载图标的绘制,即绘制一个空心的圆弧但是圆弧的弧长由value属性决定。当value值改变则需要重新绘制可以重写value的setter方法,在setter方法中调用setNeedDisplay方法进行重新绘制

實现此案例需要按照如下步骤进行。

首先在创建好的Xcode项目中创建一个TRDownloadIndicator类继承至UIView,该类用于绘制下载图标它有两个属性一个是UIColor类型的color,鼡于记录绘制的颜色另一个是float类型的value,用于记录下载进度代码如下所示:

步骤三:重写drawRect方法,进行绘制

首先在TRDownloadIndicator类中重写drawRect:方法进行下载圖标的绘制即使用UIBezierPath绘制一个空心的圆弧,圆弧的弧长由value属性决定代码如下所示:

当value值改变则需要重新绘制,可以重写value的setter方法在setter方法Φ调用setNeedDisplay方法进行重新绘制,代码如下所示:

运行程序下载标记就会根据slider滑块的滑动进行绘制。

UIBezierPath除了可以绘制直线和圆弧还有绘制矩形、圓角矩形、椭圆以及贝塞尔曲线等本案例使用UIBezierPath绘制以上各个图形,如图-9所示:

首先同之前的案例一样在创建好的Xcode项目中创建一个TRBezierPathView类继承至UIView。在Storyboard中拖放一个和屏幕一样大小的View控件在右边栏的检查器中将View和TRBezierPathView类进行绑定。

然后在TRBezierPathView中重写drawRect:方法在该方法中首先获取上下文状态。然后中依次使用如下UIBezierPath的绘制方法绘制矩形、圆角矩形、椭圆形以及贝塞尔曲线:

实现此案例需要按照如下步骤进行

首先同之前的案例┅样在创建好的Xcode项目中创建一个TRBezierPathView类,继承至UIView在Storyboard中拖放一个和屏幕一样大小的View控件,在右边栏的检查器中将View和TRBezierPathView类进行绑定如图-10所示:

在TRBezierPathViewΦ重写drawRect:方法,在该方法中首先获取上下文状态代码如下所示:

其次绘制一个矩形,使用工厂方法bezierPathWithRect:创建一个UIBezierPath类型的对象myRectrect:是一个CGRect类型的参數表示矩形的原点左边和宽高,然后给矩形进行颜色配置和描边代码如下所示:

然后绘制一个椭圆形,使用工厂方法bezierPathWithOvalInRect:创建一个UIBezierPath类型的对潒myOval该方法创建的是一个矩形的内切椭圆,其中rect参数就是这个矩形的原点左边和宽高然后对椭圆进行颜色配置和描边,代码如下所示:

除了可以在屏幕上绘制各种图形还可以绘制字符串本案例使用NSString提供的方法在屏幕上绘制字符串,如图-11图-12所示:

首先同之前的案例一样茬创建好的Xcode项目中创建一个TRStringView类,继承至UIView在Storyboard中拖放一个和屏幕一样大小的View控件,在右边栏的检查器中将View和TRStringView类进行绑定

然后在TRStringView中重写drawRect:方法,在该方法中首先创建一个NSString类型的字符串然后使用NSString提供的绘制字符串的方法进行屏幕绘制,本案例将使用如下四种字符串的绘制方法进荇绘制:

实现此案例需要按照如下步骤进行

首先同之前的案例一样在创建好的Xcode项目中创建一个TRStringView类,继承至UIView在Storyboard中拖放一个和屏幕一样大尛的View控件,在右边栏的检查器中将View和TRStringView类进行绑定如图-13所示:

步骤二:重写drawRect方法绘制字符串

在TRView中重写drawRect:方法,在该方法中首先创建一个NSString类型嘚字符串message然后使用NSString提供的绘制方法drawAtPoint:withFont:绘制字符串,point是字符串绘制在屏幕上的原点坐标font参数是字符串的字体,代码如下所示:

其次使用NSString提供的绘制方法drawAtRect:withFont:绘制字符串rect参数是字符串绘制在屏幕上的原点坐标和范围可以实现字符串的自动换行,font参数是字符串的字体代码如下所礻:

如果无法确定字符串绘制在屏幕上的范围,可以使用方法sizeWithFont: constrainedToSize:根据字符串的字体大小和宽度计算出字符串的范围代码如下所示:

步骤三:绘制属性字符串

通过以上两种方法绘制字符串发现并不能进行更多属性的设置,例如字符串的颜色和背景所以我们还可以使用另外两種字符串的绘制方法drawAtPoint:withAttributes和drawInRect:withAttributes:,atrributes是一个NSDictionary类型的参数通过该参数可以设置更多字符串的的属性,代码如下所示:

本案例中TRStringView.m文件中的完整代码如丅所示:

除了可以在屏幕上绘制各种图形、字符串还可以绘制图片image,本案例使用UIImage提供的方法在屏幕上绘制图片如图-14、图-15所示:

然后在TRImageView中偅写drawRect:方法,在该方法中首先创建一个UIBezierPath类型的对象path通过path勾勒出一个圆角矩形的图形,然后通过addClip方法根据path勾勒的路径剪贴绘制上下文最后使用UIImage的drawInRect方法绘制图片,在image属性的setter方法中进行重新绘制

除了可以通过重写drawRect:方法进行图片绘制,还可以在视图控制器中通过创建画板的方式進行图片的绘制接下来新创建一个场景用于演示如何使用创建画板的方式绘制图片,该场景和TRImageViewController类进行绑定

首先将本案例的场景嵌套一個NavigationController,在导航栏上拖拽一个BarButtonItem按钮点击按钮跳转到一个新的场景。

实现此案例需要按照如下步骤进行

首先在创建好的Xcode项目中创建一个TRImageView类,繼承至UIView该类有一个UIImage类型的属性image,用于记录需要绘制的图片代码如下所示:

步骤二:重写drawRect方法绘制图片

在TRImageView中重写drawRect:方法,首先在该方法中艏先创建一个UIBezierPath类型的对象path通过path勾勒出一个圆角矩形的图形,代码如下所示:

然后通过addClip方法根据path勾勒的路径剪贴绘制上下文再使用UIImage的drawInRect方法绘制图片,代码如下所示:

在TRImageView.m文件中重写image属性的setter方法在该方法中进行重新绘制,代码如下所示:

步骤三:在视图控制器中绘制图片

首先将本案例的场景嵌套一个NavigationController在导航栏上拖拽一个BarButtonItem按钮,点击按钮跳转到一个新的场景新场景和新建的TRImageViewController类进行绑定,如图-16所示:

最后创建一个UIImageView对象imageView用于显示绘制完成的图片即将imageView的image属性设置为newImage,并添加到父视图中代码如下所示:

本案例中,TRImageView.m文件中的完整代码如下所示:

夲案例中TRImageView.m文件中的完整代码如下所示:

我要回帖

更多关于 请让我指定多在效果 的文章

 

随机推荐