• Swift


    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)
        }
    }
  • 相关阅读:
    基础
    树梅派线程
    超声波
    电脑版微信双开多开
    子类能不能重写父类的构造方法
    window8taskost.exe一直占用cpu
    windows下rocketmq安装
    spring循环依赖问题
    线程池的种类
    并行和并发有什么区别?
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/5769947.html
Copyright © 2020-2023  润新知