绘制虚线的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的更多相关文章

  1. iOS 使用drawRect: 绘制虚线椭圆

    iOS 使用drawRect: 绘制虚线椭圆 1:首先如果要使用 drawRect 绘图 要导入 CoreGraphics.framework 框架 然后 创建 自定义view, 即是 myView继 ...

  2. iOS 学习 - 16.绘制虚线

    //绘制虚线 -(void)set{ UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(, , , )]; [ ...

  3. UIKit和Core Graphics绘图(三)——绘制虚线,椭圆以及饼图

    绘制虚线 虚线绘制主要调用CGContextSetLineDash函数. 这个函数有4个参数,除了一个是上下文外,phase为初始跳过几个点开始绘制,第三个参数为一个CGFloat数组,指定你绘制的样 ...

  4. canvas学习总结三:绘制虚线

    上一章节我们说到,线性路径的绘制,主要利用movoTo(),lineTo()等方法,当然 Canvas 2D API 也提供了虚线的绘制方法,CanvasRenderingContext2D.setL ...

  5. 【Android使用Shape绘制虚线,在4.0以上的手机显示实线】解决方式

    问题描写叙述: 用下面代码绘制虚线: <span style="font-family:Comic Sans MS;font-size:18px;"><? xml ...

  6. canvas学习总结四:绘制虚线

    上一章节我们说到,线性路径的绘制,主要利用movoTo(),lineTo()等方法,当然 Canvas 2D API 也提供了虚线的绘制方法,CanvasRenderingContext2D.setL ...

  7. 【转】Android Shape绘制虚线在手机端查看是实线的问题

    Android share绘制虚线在手机上显示实线问题 给控件添加Drawableleft等图片后,单独给图片设置动画效果,参考文章: http://blog.csdn.net/langzxz/art ...

  8. CAD交互绘制虚线(网页版)

    用户可以在CAD控件视区任意位置绘制直线. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE ...

  9. CAD交互绘制虚线(com接口)

    用户可以在控件视区任意位置绘制直线. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY ...

随机推荐

  1. Jquery动画操作的stop()函数

    今天做一个点击动画时,遇到了当快速连续点击时,动画效果会乱,并不是我们想要达到的效果. 查询了一下,确认是动画累积的原因.网上搜了一下,发现jquery 的stop()函数刚好能解决. stop(cl ...

  2. WPF中使用Grid来实现图层的效果

    <Style x:Key="ScanButtonStyle" TargetType="{x:Type Button}"> <!--<Se ...

  3. memcached 学习笔记 5

     memcached installed on linux 使用的操作系统是centos6.5 (有桌面) 1 上传libebent和memcache到/usr/local/src [root@jt ...

  4. 数据存储之第三方FMDB优化

    最近项目要用到数据库,采用的是第三方FMDB, 之前做C#时用过sqlHelper,自己就按着sqlHelper的思路封装了一下,封装的也比较简单,看到网上有一些根据FMDB封装的ORM框架,但基本都 ...

  5. Redis常用命令整理

    doc 环境下使用命令:       keys 命令         ?    匹配一个字符         *    匹配任意个(包括0个)字符         []    匹配括号间的任一个字符, ...

  6. 奇葩!把类型转成object

    事情是这样的,客户做代码审核,要求把参数类型转换成方法传入需要的类型.额,有点绕,简单来说就是 Create(UIElement e)这个方法要在调用的时候穿进去的参数转换成UIElement,哦对了 ...

  7. 你所需要的sql数据库资料

     sql语法的特点  1.没有"",所有的字符串都使用''包含  2.它的逻辑相等与赋值运算符一样都是= 如 if 1=1  3.不区别大小写,但是习惯函数上使用大写.所有与数据库 ...

  8. Web开发 学习积累20161018

    项目 一.项目做的是什么 业务逻辑 -> 增删改查 二.什么是面向对象编程,它有哪些好处 oop:object oriented programming <>核心思想:使用人类思考问 ...

  9. VS2012 常用配置

    一. 整合svn版本控制 1. 点击此 下载与SVN版本相对应的ankhsvn插件,本人用的是Subversion 1.8 2. 安装ankhsvn插件,打开VS2012,右键任一工程,有显示如下图, ...

  10. Spring FactoryBean用法

    最近在看spring ioc源码,看到FactoryBean这个内容.这个和BeanFactory的区别 1. BeanFactory: 生成bean的工厂,是一个接口,定义了很多方法 2. Fact ...