HandDraw(手繪)~demo

//聯(lián)系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄

/**

注意點(diǎn): 1.看 GIF 效果圖.

2.看連線視圖的效果圖.

3.看實(shí)現(xiàn)代碼(直接復(fù)制實(shí)現(xiàn)效果).

*/

一拭宁、GIF 效果圖:

二嫂冻、連線視圖的效果圖:

圖1:

圖2:

圖3:

圖4:

圖5:

三、實(shí)現(xiàn)代碼:

=========================

===================================================

==========================

控制器1:SHContext.h

//

//? SHContext.h

//? HandDraw(手繪)~demo

//

//? Created by石虎on 2017/8/15.

//? Copyright ? 2017年shihu. All rights reserved.

//

#ifndef SHContext_h

#define SHContext_h

/*

該方法負(fù)責(zé)繪制圓角矩形;

x1 y2:是圓角矩形左上角的座標(biāo)。

width height:控制圓角舉行的寬割卖、高

radius控制圓角矩形的四個(gè)圓角的半徑

*/

voidCGContextAddRoundRect(CGContextRefc,CGFloatx1 ,CGFloaty1

,CGFloatwidth ,CGFloatheight ,CGFloatradius)

{

//移動(dòng)到左上角

CGContextMoveToPoint(c, x1 + radius , y1);

//添加一條連接到右上角的線段

CGContextAddLineToPoint(c , x1 + width - radius, y1);

//添加一段圓弧

CGContextAddArcToPoint(c , x1 + width , y1, x1 + width

, y1 + radius, radius);

//添加一條連接到右下角的線段

CGContextAddLineToPoint(c , x1 + width, y1 + height - radius);

//添加一段圓弧

CGContextAddArcToPoint(c , x1 + width, y1 + height

, x1 + width - radius , y1 + height , radius);

//添加一條連接到左下角的線段

CGContextAddLineToPoint(c , x1 + radius, y1 + height);

//添加一段圓弧

CGContextAddArcToPoint(c , x1, y1 + height , x1

, y1 + height - radius , radius);

//添加一條連接到左上角的線段

CGContextAddLineToPoint(c , x1 , y1 + radius);

//添加一段圓弧

CGContextAddArcToPoint(c , x1 , y1 , x1 + radius , y1 , radius);

}

/*

該方法負(fù)責(zé)繪制多角星宴杀。

n:該參數(shù)通常應(yīng)設(shè)為奇數(shù),控制繪制N角星蜗元。

dx或渤、dy:控制N角星的中心。

size:控制N角星的大小

*/

voidCGContextAddStar(CGContextRefc ,NSIntegern

,CGFloatdx ,CGFloatdy ,NSIntegersize)

{

CGFloatdig =4*M_PI/ n ;

//移動(dòng)到指定點(diǎn)

CGContextMoveToPoint(c , dx , dy + size);

for(inti =1; i <= n ; i++)

{

CGFloatx =sin(i * dig);

CGFloaty =cos(i * dig);

//繪制從當(dāng)前點(diǎn)連接到指定點(diǎn)的線條

CGContextAddLineToPoint(c , x * size + dx ,y * size + dy);

}

}

#endif/* SHContext_h */

=========================

===================================================

控制器2:SHConstant.h

//=================

//=============

//

//? SHConstant.h

//? HandDraw(手繪)~demo

//

//? Created by石虎on 2017/8/15.

//? Copyright ? 2017年shihu. All rights reserved.

//

#ifndef SHConstant_h

#define SHConstant_h

typedefenum

{

kLineShape =0,

kRectShape,

kEllipseShape,

kRoundRectShape,

kPenShape

} ShapeType;

#endif/* SHConstant_h */

控制器3:SHDrawView.h

//=================

//=============

//

//? SHDrawView.h

//? HandDraw(手繪)~demo

//

//? Created by石虎on 2017/8/15.

//? Copyright ? 2017年shihu. All rights reserved.

//

#import

#import"SHConstant.h"

@interfaceSHDrawView :UIView

@property(nonatomic,strong)UIColor* currentColor;

@property(nonatomic,assign)ShapeTypeshape;

@end

控制器3:SHDrawView.m

//=================

//=============

//

//? SHDrawView.m

//? HandDraw(手繪)~demo

//

//? Created by石虎on 2017/8/15.

//? Copyright ? 2017年shihu. All rights reserved.

//

#import"SHDrawView.h"

#import"SHContext.h"

@implementationSHDrawView

CGPointfirstTouch, prevTouch, lastTouch;

//定義向內(nèi)存中圖片執(zhí)行繪圖的CGContextRef

CGContextRefbuffCtx;

UIImage* image;

- (id)initWithCoder:(NSCoder*)aCoder

{

self= [superinitWithCoder:aCoder];

if(self) {

//初始化時(shí)將當(dāng)前顏色設(shè)為紅色

self.currentColor= [UIColorredColor];

//創(chuàng)建內(nèi)存中的圖片

UIGraphicsBeginImageContext(self.bounds.size);

//獲取向內(nèi)存中圖片執(zhí)行繪圖的CGContextRef

buffCtx=UIGraphicsGetCurrentContext();

}

returnself;

}

//當(dāng)用戶手指開始觸碰時(shí)激發(fā)該方法

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event

{

UITouch*touch = [touchesanyObject];

//獲取觸碰點(diǎn)坐標(biāo)

firstTouch= [touchlocationInView:self];

//如果當(dāng)前正在進(jìn)行自由繪制奕扣,prevTouch代表第一個(gè)觸碰點(diǎn)

if(self.shape==kPenShape)

{

prevTouch=firstTouch;

}

}

//當(dāng)用戶手指在控件上拖動(dòng)時(shí)不斷地激發(fā)該方法

- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event

{

UITouch*touch = [touchesanyObject];

//獲取觸碰點(diǎn)坐標(biāo)

lastTouch= [touchlocationInView:self];

//如果當(dāng)前正在進(jìn)行自由繪制

if(self.shape==kPenShape)

{

//向內(nèi)存中的圖片執(zhí)行繪制

[selfdraw:buffCtx];

//取出內(nèi)存中的圖片薪鹦,保存到image中

image=UIGraphicsGetImageFromCurrentImageContext();

}

//通知該控件重繪,此時(shí)會(huì)實(shí)時(shí)地繪制起始點(diǎn)與用戶手指拖動(dòng)點(diǎn)之間的形狀

[selfsetNeedsDisplay];

}

//當(dāng)用戶手指離開控件時(shí)激發(fā)該方法

- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event

{

UITouch*touch = [touchesanyObject];

//獲取離開觸碰的點(diǎn)坐標(biāo)

lastTouch= [touchlocationInView:self];

//向內(nèi)存中的圖片執(zhí)行繪制惯豆,即把最終確定圖形繪制到內(nèi)存中圖片上

[selfdraw:buffCtx];

image=UIGraphicsGetImageFromCurrentImageContext();

//通知重繪池磁。

[selfsetNeedsDisplay];

}

- (void)drawRect:(CGRect)rect

{

//獲取繪圖上下文

CGContextRefctx =UIGraphicsGetCurrentContext();

//將內(nèi)存中的圖片繪制出來

[imagedrawAtPoint:CGPointZero];

//調(diào)用draw:方法執(zhí)行繪制

[selfdraw:ctx];

}

//定義一個(gè)函數(shù),用于根據(jù)firstTouch楷兽、lastTouch來確定矩形區(qū)域

- (CGRect) curRect

{

returnCGRectMake(firstTouch.x, firstTouch.y,

lastTouch.x - firstTouch.x ,

lastTouch.y - firstTouch.y);

}

- (void)draw:(CGContextRef)ctx

{

//設(shè)置線條顏色

CGContextSetStrokeColorWithColor(ctx,self.currentColor.CGColor);

//設(shè)置填充顏色

CGContextSetFillColorWithColor(ctx,self.currentColor.CGColor);

//設(shè)置線寬

CGContextSetLineWidth(ctx,2.0);

CGContextSetShouldAntialias(ctx,YES);

switch(self.shape) {

CGFloat leftTopX , leftTopY;

casekLineShape:

//添加從firstTouch到lastTouch的路徑

CGContextMoveToPoint(ctx, firstTouch.x, firstTouch.y);

CGContextAddLineToPoint(ctx, lastTouch.x, lastTouch.y);

//繪制路徑

CGContextStrokePath(ctx);

break;

casekRectShape:

//填充矩形

CGContextFillRect(ctx ,[selfcurRect]);

break;

casekEllipseShape:

//填充橢圓

CGContextFillEllipseInRect(ctx ,[selfcurRect]);

break;

casekRoundRectShape:

//計(jì)算左上角的坐標(biāo)

leftTopX = firstTouch.x < lastTouch.x ? firstTouch.x :

lastTouch.x;

leftTopY = firstTouch.y < lastTouch.y ? firstTouch.y :

lastTouch.y;

//添加圓角矩形的路徑

CGContextAddRoundRect(ctx ,leftTopX ,leftTopY ,

fabs(lastTouch.x - firstTouch.x) ,

fabs(lastTouch.y - firstTouch.y) ,16);

//填充路徑

CGContextFillPath(ctx);

break;

casekPenShape:

//添加從prevTouch到lastTouch的路徑

CGContextMoveToPoint(ctx, prevTouch.x, prevTouch.y);

CGContextAddLineToPoint(ctx, lastTouch.x, lastTouch.y);

//繪制路徑

CGContextStrokePath(ctx);

//使用prevTouch保存當(dāng)前點(diǎn)

prevTouch = lastTouch;

break;

}

}

@end

控制器1: SHContext.h

//=================

//=============

控制器4:ViewController.h

//=================

//=============

//

//? ViewController.h

//? HandDraw(手繪)~demo

//

//? Created by石虎on 2017/8/15.

//? Copyright ? 2017年shihu. All rights reserved.

//

#import

@interfaceViewController :UIViewController

//改變顏色

- (IBAction)changeColor:(UISegmentedControl*)sender;

//改變形狀

- (IBAction)changeShape:(UISegmentedControl*)sender;

@end

控制器4:ViewController.m

//=================

//=============

//

//? ViewController.m

//? HandDraw(手繪)~demo

//

//? Created by石虎on 2017/8/15.

//? Copyright ? 2017年shihu. All rights reserved.

//

#import"ViewController.h"

#import"SHDrawView.h"

@interfaceViewController()

{

NSArray*colors;

}

@end

@implementationViewController

- (void)viewDidLoad

{

[superviewDidLoad];

self.view.backgroundColor= [UIColorwhiteColor];

colors= [NSArrayarrayWithObjects:

[UIColorredColor],[UIColorgreenColor],

[UIColorblueColor],[UIColoryellowColor],

[UIColorpurpleColor],[UIColorcyanColor],

[UIColorblackColor] ,nil];

}

- (IBAction)changeColor:(UISegmentedControl*)sender {

//根據(jù)用戶的選擇來修改FKDrawView的當(dāng)前顏色

((SHDrawView*)self.view).currentColor= [colorsobjectAtIndex:

sender.selectedSegmentIndex];

}

- (IBAction)changeShape:(UISegmentedControl*)sender

{

//修改FKDrawView控件的shape屬性

((SHDrawView*)self.view).shape= sender.selectedSegmentIndex;

}

@end

//===============

//=======

謝謝!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末地熄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子芯杀,更是在濱河造成了極大的恐慌端考,老刑警劉巖雅潭,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異却特,居然都是意外死亡扶供,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門裂明,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诚欠,“玉大人,你說我怎么就攤上這事漾岳『涿啵” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵尼荆,是天一觀的道長左腔。 經(jīng)常有香客問我,道長捅儒,這世上最難降的妖魔是什么液样? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮巧还,結(jié)果婚禮上鞭莽,老公的妹妹穿的比我還像新娘。我一直安慰自己麸祷,他們只是感情好澎怒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阶牍,像睡著了一般喷面。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上走孽,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天惧辈,我揣著相機(jī)與錄音,去河邊找鬼磕瓷。 笑死盒齿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的困食。 我是一名探鬼主播边翁,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼陷舅!你這毒婦竟也來了倒彰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤莱睁,失蹤者是張志新(化名)和其女友劉穎待讳,沒想到半個(gè)月后芒澜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡创淡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年痴晦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琳彩。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡誊酌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出露乏,到底是詐尸還是另有隱情碧浊,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布瘟仿,位于F島的核電站箱锐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏劳较。R本人自食惡果不足惜驹止,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望观蜗。 院中可真熱鬧臊恋,春花似錦、人聲如沸墓捻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毙替。三九已至岸售,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厂画,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工拷邢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袱院,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓瞭稼,卻偏偏與公主長得像忽洛,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子环肘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • //聯(lián)系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄 /**注意點(diǎn): 1.看 GIF 效果圖.2.看連線...
    石虎132閱讀 547評(píng)論 0 7
  • //聯(lián)系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄 /**注意點(diǎn): 1.看 GIF 效果圖.2.看連線...
    石虎132閱讀 423評(píng)論 0 4
  • 一:canvas簡介 1.1什么是canvas欲虚? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,674評(píng)論 2 32
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜悔雹,今天將帶大家一窺ios動(dòng)畫全貌复哆。在這里你可以看...
    每天刷兩次牙閱讀 8,469評(píng)論 6 30
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果欣喧,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜,今天將帶大家一窺iOS動(dòng)畫全貌梯找。在這里你可以看...
    F麥子閱讀 5,101評(píng)論 5 13