iOS Swift 画三角形

2019-06-13  本文已影响0人  Yuency

前言:

UI设计师总是喜欢搞一些能力分布图,他/她/它们觉得这样比较直观清晰。

Swift
代码地址:https://github.com/gityuency/Autolayout
示例代码类名 【TrangleViewController】 【TriangleView】

效果图:


sanjiaoxing.png

代码


import UIKit

class TriangleView: UIView {
    
    ///最小长度
    private var minLength: CGFloat {
        return self.frame.size.width > self.frame.size.height ? self.frame.size.height : self.frame.size.width
    }
    
    ///半径
    private var R: CGFloat {
        return Y
    }
    
    ///视图中心点 X
    private var X: CGFloat {
        return self.frame.size.width * 0.5
    }
    
    ///三角形的中心点 Y
    private var Y: CGFloat {
        return minLength * 2 / 3
    }
    
    /// sin
    private let sinValue = sin(CGFloat.pi / 6)
    
    /// cos
    private let cosValue = cos(CGFloat.pi / 6)
    
    ///最外圈三角形
    private var outterTriangleLayer: CAShapeLayer = {
        let l = CAShapeLayer()
        l.strokeColor = UIColor.red.withAlphaComponent(0.5).cgColor
        l.fillColor = UIColor.clear.cgColor
        l.opacity = 1
        l.lineWidth = 2
        return l
    }()
    
    ///内圈三角形
    private var innerTriangleLayer: CAShapeLayer = {
        let l = CAShapeLayer()
        l.strokeColor = UIColor.red.withAlphaComponent(0.5).cgColor
        l.fillColor = UIColor.clear.cgColor
        l.opacity = 1
        l.lineWidth = 1
        return l
    }()
    
    ///前景绿色填充的三角形
    private var foregroundTriangleLayer: CAShapeLayer = {
        let l = CAShapeLayer()
        l.fillColor = UIColor.green.withAlphaComponent(0.5).cgColor
        return l
    }()
    
    ///中心点到三个顶点的连线
    private var lineLayer: CAShapeLayer = {
        let l = CAShapeLayer()
        l.strokeColor = UIColor.red.withAlphaComponent(0.5).cgColor
        l.fillColor = UIColor.clear.cgColor
        l.opacity = 1
        l.lineWidth = 0.5
        return l
    }()
    
    private var topRate: CGFloat = 0
    private var leftRate: CGFloat = 0
    private var rightRate: CGFloat = 0
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setUpView()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setUpView()
    }
    
    private func setUpView() {
        self.layer.addSublayer(outterTriangleLayer)
        self.layer.addSublayer(innerTriangleLayer)
        self.layer.addSublayer(lineLayer)
        self.layer.addSublayer(foregroundTriangleLayer)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        outterTriangleLayer.path = drawTriangle(cornerRadius: R, centerToTop: 1, centerToLeft: 1, centerToRight: 1)
        innerTriangleLayer.path = drawTriangle(cornerRadius: R, centerToTop: 0.5, centerToLeft: 0.5, centerToRight: 0.5)
        lineLayer.path = drawLine(cornerRadius: R)
        
        drawForeTriangle()
    }
    
    private func drawForeTriangle() {
        if (topRate + leftRate + rightRate) != 0 {
            foregroundTriangleLayer.path = drawTriangle(cornerRadius: R, centerToTop: topRate, centerToLeft: leftRate, centerToRight: rightRate)
        }
    }
    
    func showForeTriangle(topRate: CGFloat, leftRate: CGFloat, rightRate: CGFloat) {
        self.topRate = topRate
        self.leftRate = leftRate
        self.rightRate = rightRate
        drawForeTriangle()
    }
    
    private var centerPoint: CGPoint {
        return CGPoint(x: X, y: Y)
    }
    
    
    /// 画三角形
    ///
    /// - Parameters:
    ///   - cornerRadius: 半径(中心点到顶点的距离,剩下三个参数如果相同,画正三角形)
    ///   - centerToTop: 从中心点到顶点的百分比 取值:0.0 - 1.0
    ///   - centerToLeft: 从中心点到顶点的百分比 取值:0.0 - 1.0
    ///   - centerToRight: 从中心点到顶点的百分比 取值:0.0 - 1.0
    /// - Returns: path
    private func drawTriangle(cornerRadius: CGFloat, centerToTop: CGFloat, centerToLeft: CGFloat, centerToRight: CGFloat) -> CGPath {
        let path = UIBezierPath()
        let pointTop = CGPoint(x: centerPoint.x, y: centerPoint.y - cornerRadius * centerToTop)
        path.move(to: pointTop)
        let pointLeft = CGPoint(x: centerPoint.x - cornerRadius * centerToLeft * cosValue, y: centerPoint.y + cornerRadius * centerToLeft * sinValue)
        path.addLine(to: pointLeft)
        let pointRight = CGPoint(x: centerPoint.x + cornerRadius * centerToRight * cosValue, y: centerPoint.y + cornerRadius * centerToRight * sinValue)
        path.addLine(to: pointRight)
        path.close()
        return path.cgPath
    }
    
    
    /// 画从中心点到三个顶点的连线
    ///
    /// - Parameter cornerRadius: 半径
    /// - Returns:
    private func drawLine(cornerRadius: CGFloat) -> CGPath {
        let path = UIBezierPath()
        let pointTop = CGPoint(x: centerPoint.x, y: centerPoint.y - cornerRadius)
        let pointLeft = CGPoint(x: centerPoint.x - cornerRadius * cosValue, y: centerPoint.y + cornerRadius * sinValue)
        let pointRight = CGPoint(x: centerPoint.x + cornerRadius * cosValue, y: centerPoint.y + cornerRadius * sinValue)
        path.move(to: pointTop)
        path.addLine(to: centerPoint)
        path.addLine(to: pointLeft)
        path.move(to: centerPoint)
        path.addLine(to: pointRight)
        path.close()
        return path.cgPath
    }
}


上一篇下一篇

猜你喜欢

热点阅读