绘制虚线的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;

    // 线条1
    LineDashView *line1 = [[LineDashView alloc] initWithFrame:CGRectMake(0, 100, 320, lineHeight)
                                              lineDashPattern:@[@10, @10]
                                                    endOffset:0.495];
    line1.backgroundColor = [UIColor redColor];
    [self.view addSubview:line1];

    // 线条2
    LineDashView *line2 = [[LineDashView alloc] initWithFrame:CGRectMake(0, 110, 320, lineHeight)
                                              lineDashPattern:@[@5, @5]
                                                    endOffset:0.495];
    line2.backgroundColor = [UIColor redColor];
    [self.view addSubview:line2];

    // 线条3
    LineDashView *line3 = [[LineDashView alloc] initWithFrame:CGRectMake(0, 120, 320, lineHeight)
                                              lineDashPattern:@[@10, @5, @20, @10]
                                                    endOffset:0.495];
    line3.backgroundColor = [UIColor redColor];
    [self.view addSubview:line3];

    // 线条4
    LineDashView *line4 = [[LineDashView alloc] initWithFrame:CGRectMake(0, 130, 320, lineHeight)
                                              lineDashPattern:@[@10, @5, @20, @10, @30, @20]
                                                    endOffset:0.495];
    line4.backgroundColor = [UIColor redColor];
    [self.view addSubview:line4];
}

@end

需要注意的地方:

修改了UIView的backedLayer

重写了两个属性的setter方法

不过,你也可以解放限制,实现更高端用法哦,不过你需要了解下CAShapeLayer的相关内容才能进行改写.

时间: 2024-09-19 09:42:07

绘制虚线的UIView的相关文章

苹果iOS绘制虚线的例子

整理了一个方法,可以直接绘制虚线,下面直接上代码.参数说明已经给出,可直接copy使用 /**  ** lineView:       需要绘制成虚线的view  ** lineLength:     虚线的宽度  ** lineSpacing:    虚线的间距  ** lineColor:      虚线的颜色  **/ + (void)drawDashLine:(UIView *)lineView lineLength:(int)lineLength lineSpacing:(int)li

Photoshop绘制虚线的5种方法介绍

  下文给各位整理了7种直接快速在ps中绘制虚线的步骤,希望这些方法能让大家提高工作能力哦,有需要进入参考吧. 图案+填充制作虚线 先制作一个4X4的描边图片,如下图所示 选择编辑->定义图案,这样就设置一个自定的图案,然后新建一个文件,使用矩形选区工具随意画一个选框,选择编辑->填充->选择刚才我们自定义的图案,制作出下面的效果: 选取2px的高度,这个就是虚线了 使用路径文字 这种方法是通过路径走向文字来实现.分别以若干字符"-"和字符"."沿

在Photoshop中如何绘制虚线

  用Photoshop绘制虚线方法:先打开Brushes面板,双击用来画虚线的刷子,把spacing调到100%以上,便可画虚线了:用笔刷点一下起点,按住shift,再点一下末点,两点之间就画上虚线了. 分类: PS入门教程

ichart.js绘制虚线、平均分虚线效果的实现代码_javascript技巧

ichart.js绘制虚线.平均分虚线效果的实现代码 var Data=new Array(); Data[0] = { labels : ["第一单元","第二单元","第三单元","第四单元","第五单元"], datasets : [ { name : '优秀率', color:'#1dbcfe', line_width:4, value : [80,75,92,62,0] } ] } Data[1]

Android自定义View实现绘制虚线的方法详解

前言 说实话当第一次看到这个需求的时候,第一反应就是Canvas只有drawLine方法,并没有drawDashLine方法啊!这咋整啊,难道要我自己做个遍历不断的drawLine?不到1秒,我就放弃这个想法了,因为太恶心了.方法肯定是有的,只不过我不知道而已. 绘制方法 最简单的方法是利用ShapeDrawable,比如说你想用虚线要隔开两个控件,就可以在这两个控件中加个View,然后给它个虚线背景. 嗯,理论上就是这样子的,实现上也很简单. <!-- drawable 文件 --> <

android绘制虚线

有的时候我们需要一种虚线效果,比如图片的边框,愤怒的小鸟的飞翔路径,那么怎么绘制这些虚线呢?方法很多,目前我觉得好的有两种: 一.自己创建模式,一个点一个点的绘制. 二.用Android提供的 DashPathEffect 类来创建模式绘制. 下面我要演示的就是第二种方法,用Android提供给我的API来绘制. 由于是开发项目的一个小块,下面只能给出部分截图: 效果如上面. 下面看一下核心绘图代码: public void draw(Canvas mcanvas) {   GameLog.lo

用PhotoShop绘制虚线的另一种方法基础教程

近日失业在家闲得发慌,和朋友聊天说起用ps画虚线的方法,大多数人选择用ai描虚线边然后导入ps中处理,ai虽然也是我常用的图形工具, 但是往往ai的图形导入ps会出现边缘发虚的情况,大大影响了视觉效果. 于是乎,将我平时用ps画虚线的技巧整理了一下,在大牛面前,我也献丑一下,雕虫小计,请大牛们见谅. 完成效果: 步骤一:新建一个随意大小的空白文档,为了视觉效果,建议在新建的时候选用白色为背景颜色.我新建的为300x300px 步骤二(重要):背景图层上面,新建一个透明图层. 步骤三:矩形选框工具

js实现googleMap中虚线的绘制方法

function drawPrePath(array,color){ var sorrow={ path: google.maps.SymbolPath.FORWARD_CLOSED_ARROW //arrow }; var lineSymbol = { path: 'M 0,-1 0,1', strokeOpacity: 1, scale: 3 }; var pathCoord = [ new google.maps.LatLng(37.772323, -122.214897),new goo

设置好Photoshop画笔参数绘制流畅虚线

在Illustrator和CorelDraw中绘制虚线比较方便,不过在Photoshop中设置好画笔的相关参数也一样可以画好流畅的虚线,参数设置好以后可以直接使用.另外也可以先制作出路径后,用设置后的画笔描绘.大家仔细看下面的参数设置. 提醒:注意这里的双重画笔和间距设置! 同样的道理我们可以做出邮票的齿孔边缘.         注:更多精彩教程请关注三联photoshop教程栏目,三联PS群:75789345欢迎你的加入 分类: PS入门教程