Bezierpath繪制五角星(swift星級評分控件)

效果


評分效果

五角星各點的數(shù)學(xué)坐標(biāo)出處

根據(jù)該數(shù)學(xué)坐標(biāo)轉(zhuǎn)換成UIView內(nèi)坐標(biāo),生成正五角星

//Hello, this is Jack!
//  JKsStar.swift

import UIKit

class JKsStar: UIView {
    private var fillView: UIView!
    private let layerMask = CAShapeLayer()
    private let border = CAShapeLayer()
    
    
    var percent: CGFloat = 0 {  //0~1
        didSet {
            var frame = fillView.frame
            let width = self.bounds.size.width*percent
            frame.size.width = width
            fillView.frame = frame
        }
    }
    
    var fillColor: UIColor = UIColor.blue {
        didSet {
            fillView.backgroundColor = fillColor
        }
    }
    
    var borderColor = UIColor.blue {
        didSet {
            border.strokeColor = borderColor.cgColor
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        var fframe = self.bounds //!!!!!!! 不是frame
        let fWidth = self.bounds.size.width*percent
        fframe.size.width = fWidth
        
        fillView = UIView(frame: fframe)
        
        fillView.backgroundColor = fillColor
        self.addSubview(fillView)
        
        //在數(shù)學(xué)坐標(biāo)軸的坐標(biāo)
        let r: Double = Double(frame.size.width/2.0)
        
        let a_x: Double = 0
        let a_y = r
        let b_x = cos_degree(18)*r
        let b_y = sin_degree(18)*r
        let c_x = cos_degree(54)*r
        let c_y = -sin_degree(54)*r
        let d_x = -cos_degree(54)*r
        let d_y = -sin_degree(54)*r
        let e_x = -cos_degree(18)*r
        let e_y = sin_degree(18)*r
        
        //        let a = CGPoint(x: a_x, y: a_y)
        //        let b = CGPoint(x: b_x, y: b_y)
        //        let c = CGPoint(x: c_x, y: c_y)
        //        let d = CGPoint(x: d_x, y: d_y)
        //        let e = CGPoint(x: e_x, y: e_y)
        
        let tan_18_2 = tan(18/180*Double.pi)*tan(18/180*Double.pi)
        let t = (1 + tan_18_2)/(3-tan_18_2) //= 0.3819660112501
        let r_t = r*t
        
        let aa_x: Double = 0
        let aa_y = -r_t
        let bb_x = -r_t*cos_degree(18)
        let bb_y = -r_t*sin_degree(18)
        let cc_x = -r_t*cos_degree(54)
        let cc_y = r_t*sin_degree(54)
        let dd_x = r_t*cos_degree(54)
        let dd_y = r_t*sin_degree(54)
        let ee_x = r_t*cos_degree(18)
        let ee_y = -r_t*sin_degree(18)
        
        //        let aa = CGPoint(x: aa_x, y: aa_y)
        //        let bb = CGPoint(x: bb_x, y: bb_y)
        //        let cc = CGPoint(x: cc_x, y: cc_y)
        //        let dd = CGPoint(x: dd_x, y: dd_y)
        //        let ee = CGPoint(x: ee_x, y: ee_y)
        //轉(zhuǎn)換為正方形view(與圓內(nèi)切)內(nèi)部坐標(biāo)
        let a_v = CGPoint(x: r + a_x, y: r - a_y)
        let b_v = CGPoint(x: r + b_x, y: r - b_y)
        let c_v = CGPoint(x: r + c_x, y: r - c_y)
        let d_v = CGPoint(x: r + d_x, y: r - d_y)
        let e_v = CGPoint(x: r + e_x, y: r - e_y)
        
        let aa_v = CGPoint(x: r + aa_x, y: r - aa_y)
        let bb_v = CGPoint(x: r + bb_x, y: r - bb_y)
        let cc_v = CGPoint(x: r + cc_x, y: r - cc_y)
        let dd_v = CGPoint(x: r + dd_x, y: r - dd_y)
        let ee_v = CGPoint(x: r + ee_x, y: r - ee_y)
        
        let starPath_bz = UIBezierPath()
        starPath_bz.move(to: a_v)
        starPath_bz.addLine(to: dd_v)
        starPath_bz.addLine(to: b_v)
        starPath_bz.addLine(to: ee_v)
        starPath_bz.addLine(to: c_v)
        starPath_bz.addLine(to: aa_v)
        starPath_bz.addLine(to: d_v)
        starPath_bz.addLine(to: bb_v)
        starPath_bz.addLine(to: e_v)
        starPath_bz.addLine(to: cc_v)
        starPath_bz.close()
        
        layerMask.backgroundColor = UIColor.red.cgColor
        layerMask.path = starPath_bz.cgPath
        
        self.layer.mask = layerMask
        //border
        border.path = starPath_bz.cgPath
        border.strokeColor = borderColor.cgColor
        border.fillColor = nil
        self.layer.addSublayer(border)
        
    }
    
    func sin_degree(_ degree: Double) -> Double {
        return sin(degree/180*Double.pi)
    }
    
    func cos_degree(_ degree: Double) -> Double {
        return cos(degree/180*Double.pi)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

用法

override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }
    //    初始化UI
    func setupUI() {
        if starArray.count > 0 {
            starArray.removeAll()
        }
        for i in 0..<5 {
            let star = createStarAt(index: i)
            starArray.append(star)
            stars_view.addSubview(star)
        }
    }

func createStarAt(index: Int) -> JKsStar {
        let starD: CGFloat = 23.0
        let starSpacing: CGFloat = 6.0
        let starX = (starD + starSpacing)*CGFloat(index)
        
        let star = JKsStar(frame: CGRect(x: starX, y: 0, width: starD, height: starD))
        star.backgroundColor = UIColor.white
        star.borderColor = ThemeColor_Blue
        star.fillColor = ThemeColor_Blue
        return star
    }
    
    func starAt(index: Int) -> JKsStar {
        return starArray[index]
    }
    
    //評分(0~5分)
    func setScore(_ value: CGFloat) {
        for i in 0..<5 {    //5個星星
            let star = starAt(index: i)
            star.percent = 1
            
            let index = CGFloat(i)
            if index < floor(value) {
                star.percent = 1
            }else if index <= value {
                star.percent = value - index
            }else {
                star.percent = 0
            }
        }
    }

附注:
/*
假設(shè)五角星外接圓半徑為1,有一個角朝上,以五角星中心為原點:
則五個角頂點坐標(biāo)分別為(按順時針):
A(0,1)
B(cos18°,sin18°)
C(cos54°,-sin54°)
D(-cos54°,-sin54°)
E(-cos18°,sin18°)
假設(shè)t為內(nèi)部五邊形外接圓半徑,
t=(1+tan^2 (18°))/(3-tan^2 (18°)),即0.3819660112501
則五個頂點所對應(yīng)的坐標(biāo)為(即內(nèi)部五邊形的五個頂點):
AA(0,-t)
BB(-tcos18°,-tsin18°)
CC(-tcos54°,tsin54°)
DD(tcos54°,tsin54°)
EE(tcos18°,-tsin18°)
*/

數(shù)學(xué)坐標(biāo)系
iOS UIView坐標(biāo)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沮焕,一起剝皮案震驚了整個濱河市凉驻,隨后出現(xiàn)的幾起案子趋厉,更是在濱河造成了極大的恐慌追城,老刑警劉巖捣域,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逾条,死亡現(xiàn)場離奇詭異琢岩,居然都是意外死亡,警方通過查閱死者的電腦和手機师脂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門担孔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吃警,你說我怎么就攤上這事糕篇。” “怎么了酌心?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵拌消,是天一觀的道長。 經(jīng)常有香客問我安券,道長墩崩,這世上最難降的妖魔是什么氓英? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮泰鸡,結(jié)果婚禮上债蓝,老公的妹妹穿的比我還像新娘。我一直安慰自己盛龄,他們只是感情好饰迹,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著余舶,像睡著了一般啊鸭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匿值,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天赠制,我揣著相機與錄音,去河邊找鬼挟憔。 笑死钟些,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绊谭。 我是一名探鬼主播政恍,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼达传!你這毒婦竟也來了篙耗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宪赶,失蹤者是張志新(化名)和其女友劉穎宗弯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搂妻,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蒙保,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了欲主。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片追他。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岛蚤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情懈糯,我是刑警寧澤涤妒,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站赚哗,受9級特大地震影響她紫,放射性物質(zhì)發(fā)生泄漏硅堆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一贿讹、第九天 我趴在偏房一處隱蔽的房頂上張望渐逃。 院中可真熱鬧,春花似錦民褂、人聲如沸茄菊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽面殖。三九已至,卻和暖如春哭廉,著一層夾襖步出監(jiān)牢的瞬間脊僚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工遵绰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辽幌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓椿访,卻偏偏與公主長得像乌企,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赎离,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 1逛犹、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,981評論 3 119
  • 1、生成快捷方式 sudo gedit /usr/share/applications/Studio.deskto...
    拉肚閱讀 321評論 0 0
  • 感賞今天進入到一個溫暖正能量的大家庭梁剔。感謝自己給自己一個機會虽画。偶然聽到了錦明老師的親子教育音頻,說到了容易落地...
    泉水清閱讀 143評論 1 2
  • 有時荣病,內(nèi)心被觸動 僅僅因為偶然的一句話 抑或码撰,一次真誠的幫助 而這暖,如同向日葵綻放个盆。
    小綿羊的兔先生閱讀 143評論 0 0
  • 在教父眼中友誼 脖岛,是通行的貨幣 ;忠誠 颊亮,是最好的禮物 柴梆;緘默 ,是唯一的規(guī)則 终惑。他藐視一切價值 绍在,不給警告 ,不...
    子虛烏有先生閱讀 248評論 0 0