Swift自定義進(jìn)度圓

前言#

在很多場(chǎng)合我們都需要檢測(cè)數(shù)據(jù)的實(shí)時(shí)動(dòng)態(tài)级遭,比如安裝/下載/上傳 等,為了人性化設(shè)計(jì)我們會(huì)讓用戶看到這些實(shí)時(shí)的狀態(tài),本文就要將這種實(shí)時(shí)狀態(tài)的數(shù)據(jù)顯示給用戶看到,比如下載 昌抠。本文以下載為例患朱,自定義了一個(gè)顯示當(dāng)前下載狀態(tài)的進(jìn)度圓。效果如下:

測(cè)試.gif

技術(shù)要點(diǎn)

調(diào)用UIview的setNeedsDisplay方法來(lái)觸發(fā)drawRect方法從而來(lái)實(shí)現(xiàn)繪畫(huà)圖形

設(shè)置屬性的監(jiān)聽(tīng)者willSet監(jiān)聽(tīng)完成進(jìn)度值的變化

利用貝塞爾(UIBezierPath)繪圖方法在drawRect進(jìn)行圖形繪制


主要步驟#

1.定義接收進(jìn)度的屬性炊苫,并添加監(jiān)聽(tīng)者willSet
2.重寫(xiě)drawRect實(shí)現(xiàn)圖形繪制


1.定義接收進(jìn)度的屬性裁厅,并添加監(jiān)聽(tīng)者willSet,當(dāng)progress的值發(fā)生改變時(shí)調(diào)用setNeedsDisplay()方法,調(diào)用此方法會(huì)自動(dòng)觸發(fā)drawRect()方法,然后就可以根據(jù)progress的值實(shí)時(shí)繪制進(jìn)度圓了侨艾。代碼如下:
<pre>

  //零時(shí)數(shù)據(jù)存儲(chǔ)
  private var currentProgress :CGFloat = 0.0
  //設(shè)置繪圖線寬
  let lineWith :CGFloat = 10.0
  let excircleLineWith :CGFloat = 3.0

  var progress :CGFloat = 0.0 {
        //willSet觀察屬性值的變化
        willSet (newValue){
          //獲取當(dāng)前的進(jìn)度值
            currentProgress=newValue
            self.setNeedsDisplay()
        }
    }

</pre>

2.重寫(xiě)drawRect方法执虹,并利用UIBezierPath類實(shí)現(xiàn)圖形繪制,代碼如下:
<pre>

    override func drawRect(rect: CGRect) {
        
        //設(shè)置進(jìn)度圓顯示數(shù)字樣式
        let str = NSString(format: "%.02f%%", currentProgress*100)
        setTitle(str as String, forState: UIControlState.Normal)
        setTitleColor(UIColor.grayColor(), forState: UIControlState.Normal)

        
//        arcCenter 圓心坐標(biāo)
//         radius   半徑
//         startAngle 起始角度
//         endAngle   結(jié)束角度
//         clockwise   true:順時(shí)針/false:逆時(shí)針 
        let size = rect.size
        
        let arcCenter = CGPoint(x: size.width*0.5, y: size.height*0.5)
        var radius = min(size.width, size.height)*0.5
        let startAngle = CGFloat(-M_PI_2)
        let endAngle = currentProgress*2*CGFloat(M_PI) + startAngle
// 外圓設(shè)置
       radius -= self.excircleLineWith      
        let excircle = UIBezierPath(arcCenter: arcCenter, radius: radius, startAngle: CGFloat(0), endAngle:CGFloat( 2*M_PI), clockwise: true)
        
        excircle.lineWidth = excircleLineWith
        UIColor.whiteColor().set()
        excircle.lineCapStyle = CGLineCap.Round//設(shè)置線樣式
        excircle.stroke()
// 內(nèi)圓設(shè)置
        radius -= self.excircleLineWith*2
        let path = UIBezierPath(arcCenter: arcCenter, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)
    
        path.lineWidth = self.lineWith//設(shè)置線寬
        path.lineCapStyle = CGLineCap.Round//設(shè)置線樣式
      
        UIColor.whiteColor().set()
//繪制路徑
    //鏤空型
   //  path.stroke()
        
       //填充型
        path.addLineToPoint(arcCenter)
        path.fill()
    }

</pre>

3.寫(xiě)到這里自定義進(jìn)度圓已經(jīng)設(shè)置好了唠梨,我們可以直接進(jìn)行調(diào)用了袋励,關(guān)于圓的樣式我們可以自己設(shè)定顏色 UIColor.whiteColor().set(),還有大小radius等...
以下是調(diào)用時(shí)在ViewController簡(jiǎn)單寫(xiě)的代碼:
<pre>

@IBOutlet weak var progressSlider: UISlider!
    
    let progressBtn = JETProgressBar.init(frame: CGRectMake(80, 120,200, 160))
    
    override func viewDidLoad() {
        super.viewDidLoad()
   
        progressBtn.backgroundColor = UIColor.orangeColor()
        self.view .addSubview(progressBtn)
        // Do any additional setup after loading the view, typically from a nib.
    }
    @IBAction func sliderValueChange(sender: UISlider) {
        
       self.progressBtn.progress = CGFloat(sender.value)
    }

</pre>

這里的寫(xiě)到的CGRectMake()設(shè)置的大小坐標(biāo)就是對(duì)應(yīng)傳遞到drawRect方法里的rect。

最后感謝你耐心的看完了筆者的第一篇文章...
附上源碼: demo.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茬故,一起剝皮案震驚了整個(gè)濱河市盖灸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌均牢,老刑警劉巖糠雨,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異徘跪,居然都是意外死亡甘邀,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)垮庐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)松邪,“玉大人,你說(shuō)我怎么就攤上這事哨查《阂郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵寒亥,是天一觀的道長(zhǎng)邮府。 經(jīng)常有香客問(wèn)我,道長(zhǎng)溉奕,這世上最難降的妖魔是什么褂傀? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮加勤,結(jié)果婚禮上仙辟,老公的妹妹穿的比我還像新娘。我一直安慰自己鳄梅,他們只是感情好叠国,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著戴尸,像睡著了一般粟焊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孙蒙,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天项棠,我揣著相機(jī)與錄音,去河邊找鬼马篮。 笑死沾乘,一個(gè)胖子當(dāng)著我的面吹牛怜奖,可吹牛的內(nèi)容都是我干的浑测。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼迁央!你這毒婦竟也來(lái)了掷匠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤岖圈,失蹤者是張志新(化名)和其女友劉穎讹语,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蜂科,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡顽决,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了导匣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片才菠。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贡定,靈堂內(nèi)的尸體忽然破棺而出赋访,到底是詐尸還是另有隱情,我是刑警寧澤缓待,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布蚓耽,位于F島的核電站,受9級(jí)特大地震影響旋炒,放射性物質(zhì)發(fā)生泄漏步悠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一国葬、第九天 我趴在偏房一處隱蔽的房頂上張望贤徒。 院中可真熱鬧,春花似錦汇四、人聲如沸接奈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)序宦。三九已至,卻和暖如春背苦,著一層夾襖步出監(jiān)牢的瞬間互捌,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工行剂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秕噪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓厚宰,卻偏偏與公主長(zhǎng)得像腌巾,于是被迫代替她去往敵國(guó)和親遂填。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)澈蝙、插件吓坚、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評(píng)論 4 62
  • Core Graphics Framework是一套基于C的API框架,使用了Quartz作為繪圖引擎灯荧。它提供了低...
    ShanJiJi閱讀 1,523評(píng)論 0 20
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,867評(píng)論 25 707
  • 時(shí)光飛逝礁击,你可知,在不遠(yuǎn)的曾經(jīng)逗载,在那個(gè)懵懂的青春年華里哆窿,我們懷揣著對(duì)美好未來(lái)的憧憬。因?yàn)榫壏掷髡澹覀兿嗑墼谝黄鸶埽黄?..
    小敏min閱讀 270評(píng)論 0 0
  • 這是畫(huà)?有人覺(jué)得是畫(huà)捏膨,畫(huà)的太象有人覺(jué)得是照片秧均,對(duì),這是就是照片号涯,不過(guò)是被畫(huà)過(guò)的照片目胡。 這就是最近流行的新人文...
    天津愛(ài)妒攝影_IDO閱讀 234評(píng)論 0 0