Swift - 绘制背景线条

效果

源码

//
//  BackgroundLineView.swift
//  LineBackgroundView
//
//  Created by YouXianMing on 16/8/14.
//  Copyright © 2016年 YouXianMing. All rights reserved.
//

import UIKit

// MARK: Public class : BackgroundLineView

class BackgroundLineView: UIView {

    // MARK: Properties.

    /// Line width, default is 5.
    var lineWidth : CGFloat {

        get {return backgroundView.lineWidth}

        set(newVal) {

            backgroundView.lineWidth = newVal
            backgroundView.setNeedsDisplay()
        }
    }

    /// Line gap, default is 3.
    var lineGap : CGFloat {

        get {return backgroundView.lineGap}

        set(newVal) {

            backgroundView.lineGap = newVal
            backgroundView.setNeedsDisplay()
        }
    }

    /// Line color, default is grayColor.
    var lineColor : UIColor {

        get {return backgroundView.lineColor}

        set(newVal) {

            backgroundView.lineColor = newVal
            backgroundView.setNeedsDisplay()
        }
    }

    /// Rotate value, default is 0.
    var rotate : CGFloat {

        get {return backgroundView.rotate}

        set(newVal) {

            backgroundView.rotate = newVal
            backgroundView.setNeedsDisplay()
        }
    }

    convenience init(frame: CGRect, lineWidth : CGFloat, lineGap : CGFloat, lineColor : UIColor, rotate : CGFloat) {

        self.init(frame : frame)
        self.lineWidth = lineWidth
        self.lineGap   = lineGap
        self.lineColor = lineColor
        self.rotate    = rotate
    }

    // MARK: Override system method.

    override func layoutSubviews() {

        super.layoutSubviews()
        setupBackgroundView()
    }

    override init(frame: CGRect) {

        super.init(frame: frame)

        self.layer.masksToBounds = true
        self.addSubview(backgroundView)
    }

    required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")
    }

    // MARK: Private value & func.

    private let backgroundView = LineBackground(length: 0)

    private func setupBackgroundView() {

        let drawLength        = sqrt(self.bounds.size.width * self.bounds.size.width + self.bounds.size.height * self.bounds.size.height)
        backgroundView.frame  = CGRectMake(0, 0, drawLength, drawLength)
        backgroundView.center = CGPointMake(self.bounds.size.width / 2.0, self.bounds.size.height / 2.0)
        backgroundView.setNeedsDisplay()
    }
}

// MARK: Private class : LineBackground

private class LineBackground : UIView {

    private var rotate    : CGFloat = 0
    private var lineWidth : CGFloat = 5
    private var lineGap   : CGFloat = 3
    private var lineColor : UIColor = UIColor.grayColor()

    override init(frame: CGRect) {

        super.init(frame: frame)
        self.backgroundColor = UIColor.clearColor()
    }

    required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")
    }

    convenience init(length : CGFloat) {

        self.init(frame : CGRectMake(0, 0, length, length))
    }

    override func drawRect(rect: CGRect) {

        super.drawRect(rect)

        if self.bounds.size.width <= 0 || self.bounds.size.height <= 0 {

            return
        }

        let context      = UIGraphicsGetCurrentContext()
        let width        = self.bounds.size.width
        let height       = self.bounds.size.width
        let drawLength   = sqrt(width * width + height * height)
        let outerX       = (drawLength - width)  / 2.0
        let outerY       = (drawLength - height) / 2.0
        let tmpLineWidth = lineWidth <= 0 ? 5 : lineWidth
        let tmpLineGap   = lineGap   <= 0 ? 3 : lineGap

        var red   : CGFloat = 0
        var green : CGFloat = 0
        var blue  : CGFloat = 0
        var alpha : CGFloat = 0

        CGContextTranslateCTM(context, 0.5 * drawLength, 0.5 * drawLength)
        CGContextRotateCTM(context, rotate)
        CGContextTranslateCTM(context, -0.5 * drawLength, -0.5 * drawLength)

        lineColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
        CGContextSetRGBFillColor(context, red, green, blue, alpha)

        var currentX = -outerX

        while currentX < drawLength {

            CGContextAddRect(context, CGRectMake(currentX, -outerY, tmpLineWidth, drawLength))
            currentX += tmpLineWidth + tmpLineGap
        }

        CGContextFillPath(context)
    }
}

使用

//
//  ViewController.swift
//  LineBackgroundView
//
//  Created by YouXianMing on 16/8/14.
//  Copyright © 2016年 YouXianMing. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    let tmpView = BackgroundLineView(frame: CGRectMake(0, 0, 300, 300), lineWidth: 4, lineGap: 4,
                                     lineColor: UIColor.blackColor().colorWithAlphaComponent(0.045), rotate: CGFloat(M_PI_4))

    override func viewDidLoad() {

        super.viewDidLoad()

        tmpView.center = self.view.center
        self.view.addSubview(tmpView)
    }
}
时间: 2024-12-30 19:10:42

Swift - 绘制背景线条的相关文章

用Sketch和PaintCode快速得到绘制代码

http://www.cocoachina.com/ios/20150901/13155.html 作者:codeGlider 授权本站转载. 在我的上一篇文章中 swift10分钟实现炫酷的导航控制器跳转动画,有一个swift logo的形状 上一篇文章的动画 我说的就是中间用来做遮罩的形状. 它不是图片是用一段代码绘制而成的: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24     //绘制swift logo  

代码SketchPaintCode绘制

作者:codeGlider 在我的上一篇文章中 swift10分钟实现炫酷的导航控制器跳转动画,有一个swift logo的形状 上一篇文章的动画 我说的就是中间用来做遮罩的形状. 它不是图片是用一段代码绘制而成的: //绘制swift logo var bezierPath = UIBezierPath() bezierPath.moveToPoint(CGPointMake(96.14, 86.59)) bezierPath.addCurveToPoint(CGPointMake(56.82

iOS开发日记52-CALayer与coreAnimation

今天博主有一个CALayer与coreAnimation的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 进度条 常规做法 进度条并不是单纯的线性增长,在50%之前,每一次进度增加,进度条就会在y轴上面偏移一段距离,直到增长到一半进度的时候偏移位置达到顶点,然后随着进度继续增加,y轴的偏移越来越小,直到变回一条直线.从实现角度而言,使用CAShapeLayer然后在每次进度改变的时候更新其path值就能够实现.如果使用CAShapeLayer的方式,我们需要创建两个实例对象,一个放在

ASP.NET图形验证码的生成

效果: 调用方法: int[] r = QAPI.VerifImage.RandomList();//取得随机数种子列 string vcode = QAPI.VerifImage.CreateVCode(r, 4);//产生验证码字符 pictureBox1.Image = QAPI.VerifImage.CreateVerifImage(vcode, r, true, true, TextRenderingHint.AntiAlias);//生成 //-----ASP.NET中上面最后一句改

电梯模拟 设计

今天为大家带来一个超级好玩的电梯模拟系统 ·题目概要 模拟某校九层教学楼的电梯系统.该楼有一个自动电梯,能在每层停留,其中第一层是大楼的进出层,即是电梯的"本垒层",电梯"空闲"时,将来到该层候命. 电梯一共有七个状态,即正在开门(Opening).已开门(Opened).正在关门(Closing).已关门(Closed).等待(Waiting).移动(Moving).减速(Decelerate). 乘客可随机地进出于任何层.对每个人来说,他有一个能容忍的最长等待时

iOS swift使用xib绘制UIView

目标:用xib绘制一个UIView,在某个ViewController中调用. 三个文件:ViewController.swift    DemoView.swift     DemoView.xib 首先,可以专心将DemoView.xib画出来,别忘记DemoView.xib中UIView的一处设置 然后,写DemoView.swift文件,代码如下: class CoreView: UIView { //MARK: //MARK: properties @IBOutlet weak var

[Swift通天遁地]八、媒体与动画-(5)使用开源类库绘制文字、图形、图像、图表、SVG

本文将演示如何通过金刚鹦鹉的类库,进行文字.图像.图表和图形的绘制. 首先确保已经安装了所需的第三方类库.双击查看安装配置文件[Podfile] 1 platform :ios, '9.0' 2 use_frameworks! 3 4 target 'DemoApp' do 5 source 'https://github.com/CocoaPods/Specs.git' 6 pod "Macaw" 7 end 根据配置文件中的相关设置,安装第三方类库. 安装完成之后,双击打开项目文件

Swift - EasingAnimation绘制圆环动画

效果 源码 https://github.com/YouXianMing/Swift-Animations // // CircleView.swift // Swift-Animations // // Created by YouXianMing on 16/8/16. // Copyright © 2016年 YouXianMing. All rights reserved. // import UIKit // MARK: Public class : CircleView class

Swift语言指南(一)--语言基础之常量和变量

Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swift 提供了 C 与 Objective-C 中的所有基础类型,包括表示整数的 Int,表示浮点数的 Double 与 Float,表示布尔值的 Bool,以及表示纯文本数据的 String. Swift 还为两个基本集合类型 Array 与 Dictionary 提供了强大的支持,详情可参考 (集合类型)Collection Types. 与 C 语言类