zoukankan      html  css  js  c++  java
  • 绘制虚线的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的相关内容才能进行改写.

  • 相关阅读:
    Java的静态块与实例块(转)
    Programming Ability Test学习 1031. Hello World for U (20)
    Programming Ability Test学习 1011. World Cup Betting (20)
    Programming Ability Test学习 1027. Colors in Mars (20)
    Programming Ability Test学习 1064. Complete Binary Search Tree (30)
    Programming Ability Test学习 1008. Elevator (20)
    【maven详解-生命周期】Maven的生命周期和插件
    【maven详解-插件】maven插件学习之源码插件Source Xref
    $(document).ready(){}、$(fucntion(){})、(function(){})(jQuery)onload()的区别
    你还没真的努力过,就轻易输给了懒惰
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3897104.html
Copyright © 2011-2022 走看看