专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Swift

Swift 圆形渐变进度条 支持事件 支持XIB跟StoryBoard

发布时间:2011-06-30 07:27:42 文章来源:www.iduyao.cn 采编人员:星星草
Swift 圆形渐变进度条 支持事件 支持XIB和StoryBoard

最近项目用到了 一个经验条  要求颜色渐变  中间是用户头像  还要接受事件  然后自己写了个下面这个控件

//
//  XProgressView.swift
//  XProgressView
//
//  Created by eduo_xiaoP on 15/4/11.
//  Copyright (c) 2015年 eduo. All rights reserved.
//

import Foundation
import UIKit

@objc protocol XProgressViewDelegate: NSObjectProtocol {
    optional func progressTapped(progressView: XProgressView!)
}

@IBDesignable class XProgressView: UIView {
    
    struct Constant {
        static let lineWidth: CGFloat = 10
        static let trackColor = UIColor(red: 245/255.0, green: 245/255.0, blue: 245/255.0, alpha: 1)
        static let endColor = UIColor.redColor().colorWithAlphaComponent(0.8)
        static let startColor = UIColor.greenColor().colorWithAlphaComponent(0.2)
    }
    
    let gradientLayer = CAGradientLayer()
    let trackLayer = CAShapeLayer()
    let progressLayer = CAShapeLayer()
    let path = UIBezierPath()
    
    @IBInspectable var progress: Int = 0
    
    @IBInspectable var image: UIImage?
    
    weak var delegate: XProgressViewDelegate?
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    override func drawRect(rect: CGRect) {
        path.moveToPoint(CGPointMake(CGRectGetMidX(bounds) + Constant.lineWidth/2.0, Constant.lineWidth))
        path.addArcWithCenter(CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)), radius: bounds.size.width/2 - Constant.lineWidth, startAngle: angleToRadian(-90), endAngle: angleToRadian(270), clockwise: true)
        
        trackLayer.frame = bounds
        trackLayer.fillColor = UIColor.clearColor().CGColor
        trackLayer.strokeColor = Constant.trackColor.CGColor
        trackLayer.lineWidth = Constant.lineWidth
        trackLayer.lineCap = kCALineCapRound
        trackLayer.path = path.CGPath
        layer.addSublayer(trackLayer)
        
        progressLayer.frame = bounds
        progressLayer.fillColor = UIColor.clearColor().CGColor
        progressLayer.strokeColor = UIColor.orangeColor().CGColor
        progressLayer.lineWidth = Constant.lineWidth
        progressLayer.lineCap = kCALineCapSquare
        progressLayer.path = path.CGPath
        progressLayer.strokeStart = 0
        progressLayer.strokeEnd = CGFloat(progress)/100.0
        
        gradientLayer.frame = bounds
        gradientLayer.colors = [Constant.startColor.CGColor, Constant.endColor.CGColor]
        gradientLayer.mask = progressLayer
        layer.addSublayer(gradientLayer)
        
        path.addClip()
        image?.drawInRect(bounds)
    }
    
    func setProgress(pro: Int,animated anim: Bool) {
        setProgress(pro, animated: anim, withDuration: 0.55)
    }
    
    func setProgress(pro: Int,animated anim: Bool, withDuration duration: Double) {
        progress = pro
        CATransaction.begin()
        CATransaction.setDisableActions(!anim)
        CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut))
        CATransaction.setAnimationDuration(duration)
        progressLayer.strokeEnd = CGFloat(progress)/100.0
        CATransaction.commit()
    }
    
    private func angleToRadian(angle: Double)->CGFloat {
        return CGFloat(angle/Double(180.0) * M_PI)
    }
    
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        if delegate != nil && delegate!.respondsToSelector("progressTapped:") {
            delegate?.progressTapped!(self)
        }
    }
}


友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: