【swift】圆形数据表示百分比

这里写图片描述

swift 2.2

import UIKit

class ProgressView: UIView {
    /// 灰色线条的颜色
    var strokelineWidth:CGFloat = 10.0
    /// 中间字的大小
    var numbelFont = UIFont.systemFontOfSize(18)
    /// 中间字的颜色
    var numbelTextColor = UIColor.blackColor()
    /// 内部轨道颜色
    var interiorRailwayColor = UIColor.lightGrayColor()
    /// 外部轨道颜色
    var exteriorRailwayColor = UIColor.redColor()

    private var progressValue : CGFloat!
    private var progressFlag : CGFloat!
    var labelTimer : NSTimer?
    lazy var outLayer : CAShapeLayer! = {
        let Layer = CAShapeLayer()
        Layer.strokeColor = UIColor.lightGrayColor().CGColor
        Layer.fillColor = UIColor.clearColor().CGColor
        Layer.lineCap = kCALineCapRound
        self.layer.addSublayer(Layer)
        return Layer
    }()

    lazy var progressLayer : CAShapeLayer! = {
        let layerNew = CAShapeLayer()
        layerNew.fillColor = UIColor.clearColor().CGColor
        layerNew.strokeColor = UIColor.redColor().CGColor
        //progressLayer.lineCap = kCALineCapRound
        self.layer.addSublayer(layerNew)
        return layerNew
    }()

    lazy var numberLabel : UILabel! = {
        let numLabelNew = UILabel(frame: CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height))
        numLabelNew.center = CGPointMake(self.bounds.size.width / 2,self.bounds.size.height/2)
        numLabelNew.backgroundColor = UIColor.clearColor()
        numLabelNew.textAlignment = .Center
        self.addSubview(numLabelNew)
        return numLabelNew
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = UIColor.whiteColor()
    }
    /**
     调整绘制图像

     - parameter progress: 90
     - parameter animate:  true or false
     */
    func circleWithProgress(progress: CGFloat,andIsAnimate animate : Bool){
        if(animate){
            progressFlag = 0
            progressValue = progress
            // 灰色轨道
            let path = UIBezierPath(arcCenter: CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2), radius: self.bounds.size.width / 2 - strokelineWidth / 2 - 5, startAngle: CGFloat(0) , endAngle: CGFloat( M_PI * 2) , clockwise: true)
            self.outLayer.path = path.CGPath
            self.outLayer.lineWidth = strokelineWidth
            self.outLayer.strokeColor = interiorRailwayColor.CGColor

            // run轨道
            let path1 = UIBezierPath(arcCenter: CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2), radius: self.bounds.size.width/2 - strokelineWidth / 2 - 2.5 , startAngle: -CGFloat(M_PI * 0.5) , endAngle: CGFloat(M_PI * 1.5) , clockwise: true)
            self.progressLayer.path = path1.CGPath
            self.progressLayer.lineWidth = strokelineWidth + 5
            self.progressLayer.strokeColor = exteriorRailwayColor.CGColor

            let pathAnima = CABasicAnimation(keyPath: "strokeEnd")
            pathAnima.duration = Double(progress / 100.0)
            pathAnima.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
            pathAnima.fromValue = NSNumber(float: 0)
            pathAnima.toValue = NSNumber(float: Float(progress / 100.0))
            pathAnima.fillMode = kCAFillModeForwards
            pathAnima.removedOnCompletion = false
            self.progressLayer.addAnimation(pathAnima, forKey: "strokeEndAnimation")

            self.numberLabel.font = numbelFont
            self.numberLabel.textColor = numbelTextColor
            if(progress > 0){
                labelTimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "nameLbChange", userInfo: nil, repeats: true)
            }

        }else{

            self.numberLabel.text = "\(Int(progress))%"
            self.numberLabel.font = numbelFont
            self.numberLabel.textColor = numbelTextColor
            let path = UIBezierPath(arcCenter: CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2), radius: self.bounds.size.width / 2 - strokelineWidth / 2 - 5, startAngle: CGFloat(0) , endAngle: CGFloat( M_PI * 2) , clockwise: true)
            self.outLayer.path = path.CGPath
            self.outLayer.lineWidth = strokelineWidth
            self.outLayer.strokeColor = interiorRailwayColor.CGColor
            let path1 = UIBezierPath(arcCenter: CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2), radius: self.bounds.size.width/2 - strokelineWidth / 2 - 2.5 , startAngle: -CGFloat(M_PI * 0.5) , endAngle: CGFloat(M_PI * 1.5) , clockwise: true)
            self.progressLayer.path = path1.CGPath
            self.progressLayer.lineWidth = strokelineWidth + 5
            self.progressLayer.strokeEnd = progress / 100.0
            self.progressLayer.strokeColor = exteriorRailwayColor.CGColor
        }
    }
    /**
     定时器走的方法
     */
    func nameLbChange(){
        if(progressFlag >= progressValue - 1){
            labelTimer!.invalidate()
            labelTimer = nil
        }
        progressFlag! += CGFloat(1.0)
        numberLabel.text = "\(Int(progressFlag))%"

    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

swift 3++

import UIKit

class CNCircleProgressView: UIView {
    /// 灰色线条的颜色
    var strokelineWidth:CGFloat = 10.0
    /// 中间字的大小
    var numbelFont = UIFont.systemFont(ofSize: 18)
    /// 中间字的颜色
    var numbelTextColor = UIColor.black
    /// 内部轨道颜色
    var interiorRailwayColor = UIColor.lightGray
    /// 外部轨道颜色
    var exteriorRailwayColor = UIColor.red
    /// label定时器
    var labelTimer : Timer?
    /// 总的进度
    private var progressValue : CGFloat!
    /// 累加的进度
    private var progressFlag : CGFloat!
    /// 轨道layer
    private lazy var interiorRailwayLayer : CAShapeLayer! = {
        let Layer = CAShapeLayer()
        Layer.strokeColor = UIColor.lightGray.cgColor
        Layer.fillColor = UIColor.clear.cgColor
        Layer.lineCap = kCALineCapRound
        self.layer.addSublayer(Layer)
        return Layer
    }()
    /// 加载轨道layer
    private lazy var exteriorRailwayLayer : CAShapeLayer! = {
        let layerNew = CAShapeLayer()
        layerNew.fillColor = UIColor.clear.cgColor
        layerNew.strokeColor = UIColor.red.cgColor
        //progressLayer.lineCap = kCALineCapRound
        self.layer.addSublayer(layerNew)
        return layerNew
    }()

    /// 中间显示数字
    private lazy var numberLabel : UILabel! = {
        let numLabelNew = UILabel(frame: CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.bounds.size.height))
        numLabelNew.center = CGPoint(x: self.bounds.size.width / 2, y: self.bounds.size.height/2)
        numLabelNew.backgroundColor = UIColor.clear
        numLabelNew.textAlignment = .center
        self.addSubview(numLabelNew)
        return numLabelNew
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = UIColor.white

    }

    /**
     调整绘制图像

     - parameter progress: 90
     - parameter animate:  true or false
     */
    func circleWithProgress(progress: CGFloat,andIsAnimate animate : Bool){
        if animate {
            progressFlag = 0
            progressValue = progress

            let path = UIBezierPath(arcCenter: CGPoint(x: self.bounds.size.width / 2, y: self.bounds.size.height/2), radius: self.bounds.size.width / 2 - strokelineWidth / 2 - 5, startAngle: CGFloat(0), endAngle: CGFloat(M_PI * 2), clockwise: true)
            self.interiorRailwayLayer.path = path.cgPath
            self.interiorRailwayLayer.lineWidth = strokelineWidth
            self.interiorRailwayLayer.strokeColor = interiorRailwayColor.cgColor

             let pathE = UIBezierPath(arcCenter: CGPoint(x: self.bounds.size.width / 2, y: self.bounds.size.height/2), radius: self.bounds.size.width / 2 - strokelineWidth / 2 - 2.5, startAngle: -CGFloat(M_PI * 0.5), endAngle: CGFloat(M_PI * 1.5), clockwise: true)
            self.exteriorRailwayLayer.path = pathE.cgPath
            self.exteriorRailwayLayer.lineWidth = strokelineWidth + 5
            self.exteriorRailwayLayer.strokeColor = exteriorRailwayColor.cgColor

            let pathAnima = CABasicAnimation(keyPath: "strokeEnd")
            pathAnima.duration = Double(progress / 100.0)
            pathAnima.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
            pathAnima.fromValue = NSNumber(value: 0)
            pathAnima.toValue = NSNumber(value: Float(progress / 100.0))
            pathAnima.fillMode = kCAFillModeForwards
            pathAnima.isRemovedOnCompletion = false
            self.exteriorRailwayLayer.add(pathAnima, forKey: "strokeEndAnimation")

            self.numberLabel.font = numbelFont
            self.numberLabel.textColor = numbelTextColor
            if progress > 0 {
                labelTimer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(CNCircleProgressView.nameLbChange), userInfo: nil, repeats: true)
            }
        }else{
            self.numberLabel.text = "\(Int(progress))%"
            self.numberLabel.font = numbelFont
            self.numberLabel.textColor = numbelTextColor

            let path = UIBezierPath(arcCenter: CGPoint(x: self.bounds.size.width / 2, y: self.bounds.size.height/2), radius: self.bounds.size.width / 2 - strokelineWidth / 2 - 5, startAngle: CGFloat(0), endAngle: CGFloat(M_PI * 2), clockwise: true)
            self.interiorRailwayLayer.path = path.cgPath
            self.interiorRailwayLayer.lineWidth = strokelineWidth
            self.interiorRailwayLayer.strokeColor = interiorRailwayColor.cgColor

            let pathE = UIBezierPath(arcCenter: CGPoint(x: self.bounds.size.width / 2, y: self.bounds.size.height/2), radius: self.bounds.size.width / 2 - strokelineWidth / 2 - 2.5, startAngle: -CGFloat(M_PI * 0.5), endAngle: CGFloat(M_PI * 1.5), clockwise: true)
            self.exteriorRailwayLayer.path = pathE.cgPath
            self.exteriorRailwayLayer.lineWidth = strokelineWidth + 5
            self.exteriorRailwayLayer.strokeColor = exteriorRailwayColor.cgColor
            self.exteriorRailwayLayer.strokeEnd = progress / 100.0
        }
    }

    /**
     定时器走的方法
     */
    func nameLbChange(){
        if(progressFlag >= progressValue - 1){
            labelTimer!.invalidate()
            labelTimer = nil
        }
        progressFlag! += CGFloat(1.0)
        numberLabel.text = "\(Int(progressFlag))%"
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Swift 是一种面向对象的编程语言,可以用于实现各种数据结构和算法。下面是一些常用的数据结构和算法的 Swift 实现: 1. 数组(Array):Swift 的数组可以存储同一类型的元素,并且支持动态扩展和收缩。例如: ``` var array = [1, 2, 3, 4, 5] array.append(6) array.removeLast() ``` 2. 链表(Linked List):链表是一种动态数据结构,可以在运行时添加或删除元素。例如: ``` class ListNode { var val: Int var next: ListNode? init(_ val: Int) { self.val = val self.next = nil } } var head = ListNode(1) head.next = ListNode(2) head.next?.next = ListNode(3) ``` 3. 栈(Stack):栈是一种后进先出(LIFO)的数据结构。Swift 的数组可以很方便地实现栈。例如: ``` var stack = [Int]() stack.append(1) stack.append(2) stack.popLast() ``` 4. 队列(Queue):队列是一种先进先出(FIFO)的数据结构。Swift 的数组也可以实现队列,但效率不高。可以使用双端队列(Deque)来实现。例如: ``` struct Deque<T> { private var left = [T]() private var right = [T]() mutating func enqueue(_ element: T) { right.append(element) } mutating func dequeue() -> T? { if left.isEmpty { left = right.reversed() right.removeAll() } return left.popLast() } } var queue = Deque<Int>() queue.enqueue(1) queue.enqueue(2) queue.dequeue() ``` 5. 哈希表(Hash Table):哈希表是一种键值对存储的数据结构。Swift 的字典(Dictionary)就是哈希表的一种实现。例如: ``` var dict = [String: Int]() dict["one"] = 1 dict["two"] = 2 dict["one"] ``` 6. 排序算法:Swift 提供了快速排序(Quick Sort)、归并排序(Merge Sort)、堆排序(Heap Sort)等常见的排序算法的实现。例如: ``` func quickSort<T: Comparable>(_ array: [T]) -> [T] { guard array.count > 1 else { return array } let pivot = array[array.count / 2] let less = array.filter { $0 < pivot } let equal = array.filter { $0 == pivot } let greater = array.filter { $0 > pivot } return quickSort(less) + equal + quickSort(greater) } let array = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] quickSort(array) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值