iOS簡易涂鴉畫板實(shí)例

本文主要介紹一下用OC進(jìn)行手涂鴉板的簡易開發(fā)。涂鴉畫板雖然在實(shí)際應(yīng)用中的作用不大萍膛,但對于在某些社交App中卻可以起到增強(qiáng)用戶體驗(yàn)的效果吭服,尤其是自iOS10之后,iMessage增加的涂鴉功能蝗罗,在某種意義上改變了用戶的社交方式艇棕。

本篇所講的案例,主要運(yùn)用到UIBezierPath(貝塞爾曲線)串塑、UITouch的觸摸事件沼琉。
先放上效果圖:


涂鴉.gif

1、界面布局
為了方便桩匪,筆者直接使用StoryBoard搭建界面打瘪。

界面布局.jpg

2、重寫UITouch的觸摸事件
1)傻昙、當(dāng)手指接觸屏幕時(shí)闺骚,就會(huì)調(diào)用touchesBegan:withEvent方法。實(shí)現(xiàn)涂鴉的功能妆档。大致思路就是僻爽,通過" UITouch *touch = [touches anyObject]"方法獲得當(dāng)前手指的位置,以該位置繪制貝塞爾曲線的起點(diǎn)贾惦,并將所畫的線用數(shù)組保存进泼。

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //1、每次觸摸的時(shí)候都應(yīng)該去創(chuàng)建一條貝塞爾曲線
    CustomerBezierPath *path = [CustomerBezierPath new];
    //2纤虽、移動(dòng)畫筆
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self];
    [path moveToPoint:point];
    //設(shè)置線寬
    path.lineWidth = self.lineWidth;
    //獅子顏色
    path.color = self.lineColor;//保存線條當(dāng)前顏色
    if (!self.lineArray) {
        self.lineArray = [NSMutableArray new];
    }
    [self.lineArray addObject:path];
    
}

筆者這里自定義了一個(gè)CustomerBezierPath類,繼承于UIBezierPath類绞惦,主要為了能夠保存當(dāng)前線條的顏色逼纸。

#import <UIKit/UIKit.h>

@interface CustomerBezierPath : UIBezierPath

@property (nonatomic, strong) UIColor *color; //保存當(dāng)前線條的顏色

@end

2)、當(dāng)手指在屏幕上移時(shí)济蝉,動(dòng)就會(huì)調(diào)用touchesMoved:withEvent方法杰刽。實(shí)現(xiàn)畫線。將保存在線條數(shù)組中的CustomerBezierPath對象取出王滤,由于每次新畫的線都是數(shù)組的最后一個(gè)元素贺嫂,因此直接取lastObject。然后連接終點(diǎn)雁乡,重新繪制第喳。

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    CustomerBezierPath *path = self.lineArray.lastObject;
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self];
    [path addLineToPoint:point];
    //重新繪制
    [self setNeedsDisplay];
}

但是,此時(shí)運(yùn)行程序踱稍,你會(huì)發(fā)現(xiàn)什么效果也沒有曲饱。

涂鴉2.gif

接下就要執(zhí)行最重要的一步悠抹。

3、重寫drawRect方法
因?yàn)槔L圖操作是在UIView類的drawRect方法中完成的扩淀,所以如果我們要想在一個(gè)UIView中繪圖楔敌,需要寫一個(gè)擴(kuò)展UIView 的類,并重寫drawRect方法驻谆,在這里進(jìn)行繪圖操作卵凑,程序會(huì)自動(dòng)調(diào)用此方法進(jìn)行繪圖。

- (void)drawRect:(CGRect)rect{
    //遍歷數(shù)組胜臊,繪制曲線
    if(self.lineArray.count > 0){
        for (CustomerBezierPath *path in self.lineArray) {
            [path.color setStroke];
            [path setLineCapStyle:kCGLineCapRound];
            [path stroke];
        }
    }
}

4勺卢、設(shè)置Slider,控制線條粗細(xì)区端。

    //設(shè)置線寬的最大值和最小值
    self.slider.value = 1;
    self.slider.minimumValue = 1;
    self.slider.maximumValue = 10;
    [self.slider addTarget:self action:@selector(changeLineWidth) forControlEvents:UIControlEventValueChanged];
//修改線寬
- (void)changeLineWidth{
    self.boardView.lineWidth = self.slider.value;
}

5值漫、設(shè)置Button
這里說一下橡皮擦的思路,其實(shí)就是將線條顏色變?yōu)榘咨危俅萎嬀€杨何。
而撤銷,就是將存放線條的數(shù)組的最后一個(gè)元素沥邻,也就是最新的線條刪去危虱。

//撤銷
- (IBAction)undo:(id)sender {
    [self.boardView.lineArray removeLastObject];
    [self.boardView setNeedsDisplay];
}

//清屏
- (IBAction)cleanScreen:(id)sender {
//    NSLog(@"%ld",self.boardView.lineArray.count);
    [self.boardView.lineArray removeAllObjects];
    [self.boardView setNeedsDisplay];
}

//橡皮擦
- (IBAction)eraser:(id)sender {
    //修改畫板線條顏色
    self.boardView.lineColor = self.boardView.backgroundColor;
}

以上就是iOS簡易涂鴉畫板實(shí)例的大致思路,若有疑問唐全,歡迎與筆者討論埃跷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市邮利,隨后出現(xiàn)的幾起案子弥雹,更是在濱河造成了極大的恐慌,老刑警劉巖延届,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剪勿,死亡現(xiàn)場離奇詭異,居然都是意外死亡方庭,警方通過查閱死者的電腦和手機(jī)厕吉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來械念,“玉大人头朱,你說我怎么就攤上這事×浼酰” “怎么了项钮?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我寄纵,道長鳖敷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任程拭,我火速辦了婚禮定踱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恃鞋。我一直安慰自己崖媚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布恤浪。 她就那樣靜靜地躺著畅哑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪水由。 梳的紋絲不亂的頭發(fā)上荠呐,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音砂客,去河邊找鬼泥张。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鞠值,可吹牛的內(nèi)容都是我干的媚创。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼彤恶,長吁一口氣:“原來是場噩夢啊……” “哼钞钙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起声离,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤芒炼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后术徊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體本刽,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年弧关,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唤锉。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡世囊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窿祥,到底是詐尸還是另有隱情株憾,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站嗤瞎,受9級特大地震影響墙歪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贝奇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一虹菲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掉瞳,春花似錦毕源、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至该镣,卻和暖如春冻璃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背损合。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工省艳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人塌忽。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓拍埠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親土居。 傳聞我的和親對象是個(gè)殘疾皇子枣购,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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

  • Quartz2D以及drawRect的重繪機(jī)制字?jǐn)?shù)1487 閱讀21 評論1 喜歡1一、什么是Quartz2D Q...
    PurpleWind閱讀 760評論 0 3
  • Core Graphics Framework是一套基于C的API框架擦耀,使用了Quartz作為繪圖引擎棉圈。它提供了低...
    ShanJiJi閱讀 1,515評論 0 20
  • 暑假的時(shí)候,我參加了thoughtworks舉辦的暑期線上訓(xùn)練營眷蜓,短短四周分瘾,我收獲的不僅僅是對于熱門的技術(shù)棧的學(xué)習(xí)...
    消失黎明閱讀 183評論 0 2
  • 納蘭玲瓏/文 墨綠的河面 沒有一絲漣漪 跳躍過小橋 悠揚(yáng)的薩克斯漫出了竹林 路邊的小狗擒住了肉骨頭 欣喜地啃起來 ...
    納蘭玲瓏閱讀 352評論 3 15
  • 周一學(xué)習(xí)會(huì)學(xué)習(xí)"利他拓展視野"相比前期學(xué)習(xí)得利他有了更深刻的認(rèn)識(shí),更加全面。從個(gè)人吁系,到家庭德召,到社會(huì),以前只...
    徐紹剛閱讀 183評論 0 0