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的相关内容才能进行改写.

  • 相关阅读:
    Android Studio 生成Jar包时遇到的gradlew下载问题
    未解决问题
    Android -- android.os.Parcelable[] cannot be cast to ...
    vulkan gpu limits in mali
    Why GPU Program is expensive in CPU
    iOS native plugin 的代码sample
    USC-- compute shader ps vs
    zprepass 之后再base pass为什么用equal不用lessequal
    memory management Vulkan
    hlslcc
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3897104.html
Copyright © 2011-2022 走看看