使用 Core Graphics 繪制基本形狀

作者:Arthur Knopper,原文鏈接,原文日期:2015-08-31
譯者:lfb_CD吃媒;校對(duì):千葉知風(fēng);定稿:shanks

Core GraphicsCocoaCocoa Touch所共有的API吕喘。它允許你在畫布上繪制圖形對(duì)象赘那。在此篇教程中,我們會(huì)繪制一些標(biāo)準(zhǔn)的圖形氯质,比如三角形或者圓形募舟。教程運(yùn)行在 iOS 9 和 Xcode 7 下。

打開 Xcode 并創(chuàng)建一個(gè)new Single View Application項(xiàng)目闻察。項(xiàng)目名稱為IOS9DrawShapesTutorial拱礁,接著填上你的Organization NameOrganization Identifier琢锋,選擇 Swift 語言,確保在設(shè)備一欄只選擇了 IPhone呢灶。

打開故事板吴超,在主視圖中拖入三個(gè)按鈕,使他們水平對(duì)齊鸯乃,并分別設(shè)置title為"Lines, Rectangle, Circle"鲸阻。之后你的故事板內(nèi)容應(yīng)該像下面這樣:

選中所有按鈕,打開Attributes Inspector(屬性檢測(cè)器)飒责。在View部分給從左到右的按鈕添上"0,1,2"的tag赘娄。tag是我們后面才需要的,我們可以通過tag的值得知哪個(gè)按鈕被按下了宏蛉。

打開Assistant Editor(關(guān)聯(lián)面板)遣臼,并確保ViewController.swift文件是打開著的。按住 Ctrl鍵拾并,把Lines按鈕拖出到ViewController.swift文件中揍堰,并創(chuàng)建下面的Action

選中其它的按鈕,按住Ctrl鍵并拖到ViewController類的IBAction方法里(剛剛創(chuàng)建的那個(gè)Action)嗅义。之后我們點(diǎn)擊每一個(gè)按鈕就會(huì)觸發(fā)這里的IBAction方法屏歹。繪制的圖形會(huì)呈現(xiàn)在一個(gè)自定義的視圖中。接下來之碗,我們?yōu)轫?xiàng)目添加一個(gè)新文件蝙眶。選中File ->New File ->iOS ->Source ->Cocoa Touch Class。類名稱為"ShapeView",確保父類為UIView褪那。

打開ShapeView.swift文件幽纷,添加下面的屬性。

var currentShapeType: Int = 0

currentShapeType屬性是用于選擇正確的方法畫出對(duì)應(yīng)的對(duì)象博敬。接著添加初始化方法:

init(frame: CGRect, shape: Int) {
    super.init(frame: frame)
    self.currentShapeType = shape
}
    
required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

當(dāng)自定義視圖被初始化的時(shí)候友浸,tag的值會(huì)決定繪制的圖形類型。drawRect方法會(huì)在自定義視圖繪制的過程中調(diào)用偏窝。

override func drawRect(rect: CGRect) {
    switch currentShapeType {
    case 0: drawLines()
    case 1: drawRectangle()
    case 2: drawCircle()
    default: print("default")
    }        
}

接下來收恢,實(shí)現(xiàn)繪圖的方法:

func drawLines() {
    //1
    let ctx = UIGraphicsGetCurrentContext()
        
    //2
    CGContextBeginPath(ctx)
    CGContextMoveToPoint(ctx, 20.0, 20.0)
    CGContextAddLineToPoint(ctx, 250.0, 100.0)
    CGContextAddLineToPoint(ctx, 100.0, 200.0)
    CGContextSetLineWidth(ctx, 5)
        
    //3
    CGContextClosePath(ctx)
    CGContextStrokePath(ctx)
}
    
func drawRectangle() {
    let center = CGPointMake(self.frame.size.width / 2.0, self.frame.size.height / 2.0)
    let rectangleWidth:CGFloat = 100.0
    let rectangleHeight:CGFloat = 100.0
    let ctx = UIGraphicsGetCurrentContext()
        
    //4
    CGContextAddRect(ctx, CGRectMake(center.x - (0.5 * rectangleWidth), center.y - (0.5 * rectangleHeight), rectangleWidth, rectangleHeight))
    CGContextSetLineWidth(ctx, 10)
    CGContextSetStrokeColorWithColor(ctx, UIColor.grayColor().CGColor)
    CGContextStrokePath(ctx)
            
    //5
    CGContextSetFillColorWithColor(ctx, UIColor.greenColor().CGColor)
    CGContextAddRect(ctx, CGRectMake(center.x - (0.5 * rectangleWidth), center.y - (0.5 * rectangleHeight), rectangleWidth, rectangleHeight))
        
    CGContextFillPath(ctx)
}
    
func drawCircle() {
    let center = CGPointMake(self.frame.size.width / 2.0, self.frame.size.height / 2.0)
    let ctx = UIGraphicsGetCurrentContext()
    CGContextBeginPath(ctx)
        
    //6 
    CGContextSetLineWidth(ctx, 5)
        
    let x:CGFloat = center.x
    let y:CGFloat = center.y
    let radius: CGFloat = 100.0
    let endAngle: CGFloat = CGFloat(2 * M_PI)
        
    CGContextAddArc(ctx, x, y, radius, 0, endAngle, 0)
        
    CGContextStrokePath(ctx)
}
  1. 這里的Graphic Context就是你繪圖的畫布。如果你想在一個(gè)視圖上繪圖祭往,那么view就是你的畫布伦意。這里我們需要得到一個(gè)Graphic Context的引用。
  2. path就是一些線條,弧線和曲線的集合,你可以在當(dāng)前畫布使用它們來構(gòu)建的復(fù)雜對(duì)象硼补。這里我們繪制了一些線條并設(shè)置了線條的寬度為 5默赂。
  3. 此處關(guān)閉path,并繪制圖像到畫布上括勺。
  4. CGContextAddRect方法給我們繪制了一個(gè)長方形缆八,并且外框的顏色為灰色曲掰。
  5. 這里定義了一個(gè)相同的長方形,并填充綠色到內(nèi)部奈辰。
  6. CGContextAddArc繪制了一個(gè)圓形栏妖。

接著,在ViewController.swift文件中實(shí)現(xiàn)buttonPressed方法

@IBAction func buttonPressed(sender: UIButton) {
    let myView = ShapeView(frame: CGRectMake(50, 200, 280, 250), shape: sender.tag)
    myView.backgroundColor = UIColor.cyanColor()
    view.addSubview(myView)
}

編譯并運(yùn)行程序奖恰,點(diǎn)擊不同的按鈕來繪制不同的圖形吊趾。


你可以在Github上下載IOS9DrawShapesTutorial的代碼。

本文由 SwiftGG 翻譯組翻譯瑟啃,已經(jīng)獲得作者翻譯授權(quán)论泛,最新文章請(qǐng)?jiān)L問 http://swift.gg

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛹屿,一起剝皮案震驚了整個(gè)濱河市屁奏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌错负,老刑警劉巖坟瓢,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異犹撒,居然都是意外死亡折联,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門识颊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诚镰,“玉大人,你說我怎么就攤上這事祥款∏灞浚” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵镰踏,是天一觀的道長。 經(jīng)常有香客問我沙合,道長奠伪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任首懈,我火速辦了婚禮绊率,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘究履。我一直安慰自己滤否,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布最仑。 她就那樣靜靜地躺著藐俺,像睡著了一般炊甲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欲芹,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天卿啡,我揣著相機(jī)與錄音,去河邊找鬼菱父。 笑死颈娜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浙宜。 我是一名探鬼主播官辽,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼粟瞬!你這毒婦竟也來了同仆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤亩钟,失蹤者是張志新(化名)和其女友劉穎乓梨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體清酥,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扶镀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了焰轻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臭觉。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辱志,靈堂內(nèi)的尸體忽然破棺而出蝠筑,到底是詐尸還是另有隱情,我是刑警寧澤揩懒,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布什乙,位于F島的核電站,受9級(jí)特大地震影響已球,放射性物質(zhì)發(fā)生泄漏臣镣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一智亮、第九天 我趴在偏房一處隱蔽的房頂上張望忆某。 院中可真熱鬧,春花似錦阔蛉、人聲如沸弃舒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聋呢。三九已至苗踪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坝冕,已是汗流浹背徒探。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喂窟,地道東北人测暗。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像磨澡,于是被迫代替她去往敵國和親碗啄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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