绘制虚线的UIView
绘制虚线的UIView
CAShapeLayer配合贝塞尔曲线可以绘制曲线,笔者继承了一个UIView的子类,并将该子类的backedLayer替换为CAShapeLayer,以此来实现绘制虚线的效果.
绘制出各种虚线的效果图:
实现的源码:
LineDashView.h 与 LineDashView.m
//
// LineDashView.h
// DASH
//
// 绘制虚线用的View
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import <UIKit/UIKit.h> @interface LineDashView : UIView @property (nonatomic, strong) NSArray *lineDashPattern; // 线段分割模式
@property (nonatomic, assign) CGFloat endOffset; // 取值在 0.001 --> 0.499 之间 - (instancetype)initWithFrame:(CGRect)frame
lineDashPattern:(NSArray *)lineDashPattern
endOffset:(CGFloat)endOffset; @end
//
// LineDashView.m
// DASH
//
// 绘制虚线用的View
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "LineDashView.h" @interface LineDashView () {
CAShapeLayer *_shapeLayer;
} @end @implementation LineDashView - (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.bounds];
_shapeLayer = (CAShapeLayer *)self.layer;
_shapeLayer.fillColor = [UIColor clearColor].CGColor;
_shapeLayer.strokeStart = 0.001;
_shapeLayer.strokeEnd = 0.499;
_shapeLayer.lineWidth = frame.size.height;
_shapeLayer.path = path.CGPath;
}
return self;
} - (instancetype)initWithFrame:(CGRect)frame
lineDashPattern:(NSArray *)lineDashPattern
endOffset:(CGFloat)endOffset
{
LineDashView *lineDashView = [[LineDashView alloc] initWithFrame:frame];
lineDashView.lineDashPattern = lineDashPattern;
lineDashView.endOffset = endOffset; return lineDashView;
} #pragma mark - 修改view的backedLayer为CAShapeLayer
+ (Class)layerClass
{
return [CAShapeLayer class];
} #pragma mark - 改写属性的getter,setter方法
@synthesize lineDashPattern = _lineDashPattern;
- (void)setLineDashPattern:(NSArray *)lineDashPattern
{
_lineDashPattern = lineDashPattern;
_shapeLayer.lineDashPattern = lineDashPattern;
}
- (NSArray *)lineDashPattern
{
return _lineDashPattern;
} @synthesize endOffset = _endOffset;
- (void)setEndOffset:(CGFloat)endOffset
{
_endOffset = endOffset;
if (endOffset < 0.499 && endOffset > 0.001)
{
_shapeLayer.strokeEnd = _endOffset;
}
}
- (CGFloat)endOffset
{
return _endOffset;
} #pragma mark - 重写了系统的backgroundColor属性
- (void)setBackgroundColor:(UIColor *)backgroundColor
{
_shapeLayer.strokeColor = backgroundColor.CGColor;
}
- (UIColor *)backgroundColor
{
return [UIColor colorWithCGColor:_shapeLayer.strokeColor];
} @end
使用源码:
//
// RootViewController.m
// DASH
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "RootViewController.h"
#import "LineDashView.h" @interface RootViewController () @end @implementation RootViewController - (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor blackColor]; // 线条宽度
CGFloat lineHeight = ; // 线条1
LineDashView *line1 = [[LineDashView alloc] initWithFrame:CGRectMake(, , , lineHeight)
lineDashPattern:@[@, @]
endOffset:0.495];
line1.backgroundColor = [UIColor redColor];
[self.view addSubview:line1]; // 线条2
LineDashView *line2 = [[LineDashView alloc] initWithFrame:CGRectMake(, , , lineHeight)
lineDashPattern:@[@, @]
endOffset:0.495];
line2.backgroundColor = [UIColor redColor];
[self.view addSubview:line2]; // 线条3
LineDashView *line3 = [[LineDashView alloc] initWithFrame:CGRectMake(, , , lineHeight)
lineDashPattern:@[@, @, @, @]
endOffset:0.495];
line3.backgroundColor = [UIColor redColor];
[self.view addSubview:line3]; // 线条4
LineDashView *line4 = [[LineDashView alloc] initWithFrame:CGRectMake(, , , lineHeight)
lineDashPattern:@[@, @, @, @, @, @]
endOffset:0.495];
line4.backgroundColor = [UIColor redColor];
[self.view addSubview:line4];
} @end
需要注意的地方:
修改了UIView的backedLayer
重写了两个属性的setter方法
不过,你也可以解放限制,实现更高端用法哦,不过你需要了解下CAShapeLayer的相关内容才能进行改写.
绘制虚线的UIView的更多相关文章
- iOS 使用drawRect: 绘制虚线椭圆
iOS 使用drawRect: 绘制虚线椭圆 1:首先如果要使用 drawRect 绘图 要导入 CoreGraphics.framework 框架 然后 创建 自定义view, 即是 myView继 ...
- iOS 学习 - 16.绘制虚线
//绘制虚线 -(void)set{ UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(, , , )]; [ ...
- UIKit和Core Graphics绘图(三)——绘制虚线,椭圆以及饼图
绘制虚线 虚线绘制主要调用CGContextSetLineDash函数. 这个函数有4个参数,除了一个是上下文外,phase为初始跳过几个点开始绘制,第三个参数为一个CGFloat数组,指定你绘制的样 ...
- canvas学习总结三:绘制虚线
上一章节我们说到,线性路径的绘制,主要利用movoTo(),lineTo()等方法,当然 Canvas 2D API 也提供了虚线的绘制方法,CanvasRenderingContext2D.setL ...
- 【Android使用Shape绘制虚线,在4.0以上的手机显示实线】解决方式
问题描写叙述: 用下面代码绘制虚线: <span style="font-family:Comic Sans MS;font-size:18px;"><? xml ...
- canvas学习总结四:绘制虚线
上一章节我们说到,线性路径的绘制,主要利用movoTo(),lineTo()等方法,当然 Canvas 2D API 也提供了虚线的绘制方法,CanvasRenderingContext2D.setL ...
- 【转】Android Shape绘制虚线在手机端查看是实线的问题
Android share绘制虚线在手机上显示实线问题 给控件添加Drawableleft等图片后,单独给图片设置动画效果,参考文章: http://blog.csdn.net/langzxz/art ...
- CAD交互绘制虚线(网页版)
用户可以在CAD控件视区任意位置绘制直线. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE ...
- CAD交互绘制虚线(com接口)
用户可以在控件视区任意位置绘制直线. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY ...
随机推荐
- 常见的接口与类 -- Comparator
接口Comparator 1.1 前面我们讲过Java提供了一个用于比较的接口Comparable,提供了一个比较的方法,所有实现该接口的类,都动态的实现了该比较方法.实际上Java中除了比较一个接口 ...
- 13 Timer和TimerTask 示例
定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行.在Java中,可以通过Timer和TimerTask类来实现定义调度的功能 1 Timerjava.lang.Objec ...
- R语言 删除变量rm函数
变量可以通过使用 rm()函数来删除.下面我们删除变量var.3.然后再打印变量时出现异常错误. rm(var.3) print(var.3) 当上面的代码执行时,它产生以下结果: [1] " ...
- 问题集录--Android:解决Studio新建项目时,在 Building gradle project info 一直卡住
Android Studio导入项目的时候,一直卡在Building gradle project info这一步,主要原因还是因为被墙的结果.gradle官网虽然可以访问,但是速度连蜗牛都赶不上.. ...
- Angular 4+ 修仙之路
Angular 4.x 快速入门 Angular 4 快速入门 涉及 Angular 简介.环境搭建.插件表达式.自定义组件.表单模块.Http 模块等 Angular 4 基础教程 涉及 Angul ...
- C#中获取各种路径获取方法
// 获取程序的基目录.System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径,包含文件名System.Diagnostics.Proces ...
- Redis 【string】 一句话说明
APPEND----------------------------------------------在字符串后面追加 BITCOUNT------------------------------- ...
- 【总】java面试题
100+经典Java面试题及答案解析 https://www.cnblogs.com/pureEve/p/6546280.html 2017 最新java面试题(技术面试) https://blog. ...
- 关于vue.js中slot的理解
slot这块看官网文档,起初有点不懂,仔细研究还是最终理解了,slot是用来干嘛的呢,先看下一个例子: <script src="https://unpkg.com/vue/dist/ ...
- freemarker学习笔记
在模板中定义的变量有三种类型: 引用 1:plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换. 2:局部变量:在宏定义体中有效,使用loca ...