iOS&swift繪制扇形圖UIGraphicsGetCurrentContext

一、獲取上下文繪制圖形只能在系統(tǒng)方法draw(_ rect: CGRect)中完成,剛剛這幾天有這個(gè)需求,花一點(diǎn)時(shí)間記錄一下舟陆,本文使用swift語言完成,完成效果如下:
66D51956-6A71-4867-B06A-8108B6306D19.png

二耻矮、直接上代碼吧秦躯,首先創(chuàng)建一個(gè)文字?jǐn)?shù)組以及l(fā)abel容器,可以增減數(shù)組內(nèi)容

var labels = Array<UILabel>()
let titles = ["應(yīng)收賬款","應(yīng)付賬款","應(yīng)繳稅金","貨幣資金余額","凈利潤增長率","營業(yè)收入"]

draw(_ rect: CGRect)代碼

override func draw(_ rect: CGRect) {
        
        ///移除視圖上已有l(wèi)abel
        for label in self.labels {
            label.removeFromSuperview()
        }
        var values = Array<Int>()
        var sum = 0
        
        ///生成隨機(jī)數(shù)
        for _ in titles {
            let rand = Int.random(in: 200...500)
            values.append(rand)
            sum += rand
        }
        
        ///計(jì)算百分比
        var percents = Array<CGFloat>()
        for value in values {
            percents.append(CGFloat(value) / CGFloat(sum))
        }
        
        let center = CGPoint.init(x: kScreenWidth / 2.0, y: (self.height - self.bottomView.height) / 2.0)
        let radius = kScreenWidth / 2.0 / 1.8
        let context = UIGraphicsGetCurrentContext()!
 
        ///折線半徑
        let radius2 = radius + 30.0
        ///label寬度不能超出屏幕
        let width = kScreenWidth/2.0 - radius2
        let height: CGFloat = 20.0
        
        var index = 0
        var startAngle:CGFloat = 0.0
        for percent in percents {
            let angle = CGFloat.pi * 2.0 * percent
            let color = UIColor.init(red: CGFloat.random(in: 0.0...1.0), green: CGFloat.random(in: 0.0...1.0), blue: CGFloat.random(in: 0.0...1.0), alpha: 1.0)
            ///畫扇形
            context.move(to: center)
            context.setFillColor(color.cgColor)
            context.addArc(center: center, radius: CGFloat(radius), startAngle: startAngle, endAngle: startAngle + angle, clockwise: false)
            context.fillPath()
            
            ///畫折線
            let halfAngle = startAngle + angle / 2.0
            let point1 = self.getPoint(center: center, angle: halfAngle, radius: radius)
            let point2 = self.getPoint(center: center, angle: halfAngle, radius: radius2)
            let point3x = point1.x <= point2.x ? point2.x + width : point2.x - width
            let point3 = CGPoint.init(x: point3x, y: point2.y)
            context.move(to: point1)
            context.addLines(between: [point1,point2,point3])
            context.setStrokeColor((UIColor.lightGray.cgColor))
            context.strokePath()
            
            ///值標(biāo)簽
            let labelx = point1.x <= point2.x ? point2.x : point3.x
            let label = UILabel.init(frame: CGRect.init(x:labelx, y: point2.y - height, width: width, height: height))
            label.font = UIFont.systemFont(ofSize: 15)
            label.textAlignment = .center
            label.textColor = UIColor.gray
            label.text = "¥" + String(values[index] * 100)
            self.addSubview(label)
            self.labels.append(label)
            
            ///文字標(biāo)簽
            let textLabel = UILabel.init(frame: CGRect.init(x: 0, y: 0, width: width, height: 30))
            textLabel.center = self.getPoint(center: center, angle: halfAngle, radius: radius - 30)
            textLabel.font = UIFont.systemFont(ofSize: 10)
            textLabel.textColor = .white
            textLabel.textAlignment = .center
            textLabel.numberOfLines = 0
            textLabel.text = self.titles[index] + "\n" + String.init(format: "%.f%%", percent * 100.0)
            textLabel.transform = CGAffineTransform.init(rotationAngle: halfAngle + CGFloat.pi / 2.0)
            self.addSubview(textLabel)
            self.labels.append(textLabel)
            
            startAngle += angle
            index += 1
        }
        
        let toolLabel = UILabel.init(frame: CGRect.init(x: 0, y: 0, width: radius, height: radius))
        toolLabel.backgroundColor = UIColor.white
        toolLabel.center = center
        toolLabel.setCornerRadius(0)///自定義方法裆装,設(shè)置圓角
        self.addSubview(toolLabel)
        self.labels.append(toolLabel)
    }

三踱承、自定義通過圓心、弧度哨免、半徑獲取目標(biāo)點(diǎn)CGPoint

func getPoint(center: CGPoint, angle: CGFloat, radius: CGFloat) -> CGPoint {
        let x = center.x + cos(angle) * radius
        let y = center.y + sin(angle) * radius
        return CGPoint.init(x: x, y: y)
    }

四勾扭、總結(jié):其實(shí)挺簡單的,主要是思路要清晰铁瞒,不明白地方的歡迎大家在下發(fā)留言妙色。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者慧耍。
  • 序言:七十年代末身辨,一起剝皮案震驚了整個(gè)濱河市丐谋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌煌珊,老刑警劉巖号俐,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異定庵,居然都是意外死亡吏饿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蔬浙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猪落,“玉大人,你說我怎么就攤上這事畴博”考桑” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵俱病,是天一觀的道長官疲。 經(jīng)常有香客問我,道長亮隙,這世上最難降的妖魔是什么途凫? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮溢吻,結(jié)果婚禮上维费,老公的妹妹穿的比我還像新娘。我一直安慰自己煤裙,他們只是感情好掩完,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布噪漾。 她就那樣靜靜地躺著硼砰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪欣硼。 梳的紋絲不亂的頭發(fā)上题翰,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機(jī)與錄音诈胜,去河邊找鬼豹障。 笑死,一個(gè)胖子當(dāng)著我的面吹牛焦匈,可吹牛的內(nèi)容都是我干的血公。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼缓熟,長吁一口氣:“原來是場噩夢啊……” “哼累魔!你這毒婦竟也來了摔笤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤垦写,失蹤者是張志新(化名)和其女友劉穎吕世,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梯投,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡命辖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了分蓖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尔艇。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咆疗,靈堂內(nèi)的尸體忽然破棺而出漓帚,到底是詐尸還是另有隱情,我是刑警寧澤午磁,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布尝抖,位于F島的核電站,受9級特大地震影響迅皇,放射性物質(zhì)發(fā)生泄漏昧辽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一登颓、第九天 我趴在偏房一處隱蔽的房頂上張望搅荞。 院中可真熱鬧,春花似錦框咙、人聲如沸咕痛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茉贡。三九已至,卻和暖如春者铜,著一層夾襖步出監(jiān)牢的瞬間腔丧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工作烟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愉粤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓拿撩,卻偏偏與公主長得像衣厘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子压恒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

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