效果图
源码
// // CircleView.swift // CircleView // // Created by YouXianMing on 15/10/7. // Copyright © 2015年 YouXianMing. All rights reserved. // import UIKit class CircleView: UIView { // MARK: - 变量 var lineWidth : CGFloat = 1 var lineColor : UIColor = UIColor.blackColor() var clockWise : Bool = false var startAngle : CGFloat = 0 var duration : NSTimeInterval = 0.2 private var circleLayer : CAShapeLayer! // MARK: - Public Method /** 构建view,让参数生效 */ func buildView() { let size = bounds.size let point = CGPoint(x: size.height / 2, y: size.width / 2) let radius = size.width / 2 - lineWidth / 2 var tmpStartAngle : CGFloat = 0 var tmpEndAngle : CGFloat = 0 if (clockWise == true) { tmpStartAngle = -radian(Double(180 - startAngle)); tmpEndAngle = radian(Double(180 + self.startAngle)); } else { tmpStartAngle = radian(Double(180 - self.startAngle)); tmpEndAngle = -radian(Double(180 + self.startAngle)); } let circlePath = UIBezierPath(arcCenter: point, radius: radius, startAngle: tmpStartAngle, endAngle: tmpEndAngle, clockwise: clockWise) circleLayer.path = circlePath.CGPath circleLayer.strokeColor = lineColor.CGColor circleLayer.fillColor = UIColor.clearColor().CGColor circleLayer.lineWidth = lineWidth circleLayer.strokeEnd = 0 } /** 绘制圆形百分比 - parameter percent: 百分比 - parameter animated: 是否开启动画 */ func changeToPercent(var percent : CGFloat, animated : Bool) { if (percent <= 0) { percent = 0; } else if (percent >= 1) { percent = 1; } if (animated) { let basicAnimation : CABasicAnimation! = CABasicAnimation() basicAnimation.keyPath = "strokeEnd" basicAnimation.duration = (duration <= 0 ? 0.2 : duration) basicAnimation.fromValue = circleLayer.strokeEnd basicAnimation.toValue = percent circleLayer.strokeEnd = percent circleLayer.addAnimation(basicAnimation, forKey: nil) } else { CATransaction.setDisableActions(true) circleLayer.strokeEnd = percent CATransaction.setDisableActions(false) } } // MARK: - System Method override init(frame: CGRect) { super.init(frame: frame) createCircleLayer() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } // MARK: - Private Method private func radian(degrees : Double) -> CGFloat { return CGFloat((M_PI * degrees) / 180) } private func createCircleLayer() { circleLayer = CAShapeLayer() circleLayer.frame = self.bounds self.layer.addSublayer(circleLayer) } }
// // ViewController.swift // CircleView // // Created by YouXianMing on 15/10/7. // Copyright © 2015年 YouXianMing. All rights reserved. // import UIKit class ViewController: UIViewController { var eventTimer : NSTimer! var circleView : CircleView! override func viewDidLoad() { super.viewDidLoad() eventTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "timerEvent", userInfo: nil, repeats: true) circleView = CircleView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) circleView.lineWidth = 1 circleView.lineColor = UIColor.blackColor() circleView.duration = 0.25 circleView.clockWise = true circleView.startAngle = 90 circleView.center = view.center circleView.buildView() view.addSubview(circleView) } func timerEvent() { circleView.changeToPercent(CGFloat(arc4random() % 101) / 100, animated: true) } }
说明
参数查看并没有OC那么直白.
时间: 2024-12-28 15:02:22