ios 畫圖

1.效果圖

Untitled3.gif

2.代碼展示

  1. 創(chuàng)建header file
/*
  該方法負(fù)責(zé)繪制圓角矩形
 x1,y2: 圓角矩形左上角的坐標(biāo)
 width , height :控制圓角矩形寬高
 radius 控制圓角矩形的四個(gè)圓角的半徑
 */
//void CGContextAssRoundRect(CGContextRef c, CGFloat x1, CGFloat y1, CGFloat width, CGFloat height, CGFloat radius)
//{
//    //移動(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);
//    
//}
void CGContextAddRoundRect(CGContextRef c, CGFloat x1 , CGFloat y1, CGFloat width , CGFloat height , CGFloat radius)
{
    // 移動(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);
}


void CGContextAddStar(CGContextRef c , NSInteger n, CGFloat dx , CGFloat dy , NSInteger size)
{
    CGFloat dig = 4 * M_PI / n ;
    // 移動(dòng)到指定點(diǎn)
    CGContextMoveToPoint(c , dx , dy + size);
    for(int i = 1 ; i <= n ; i++)
    {
        CGFloat x = sin(i * dig);
        CGFloat y = cos(i * dig);
        // 繪制從當(dāng)前點(diǎn)連接到指定點(diǎn)的線條
        CGContextAddLineToPoint(c , x * size + dx ,y * size + dy);
    }
}

2.再創(chuàng)建一個(gè)header file

//枚舉類型
typedef enum
{
    klineShape = 0,
    krectShape,
    kEillpseShape,
    kRoundRectShape,
    kPenShape
    
}ShapeType;

3.繼承uiview

@property (nonatomic, strong) UIColor* currentColor;
@property (nonatomic, assign) ShapeType shape;

CGPoint firstTouch, prevTouch, lastTouch;
// 定義向內(nèi)存中圖片執(zhí)行繪圖的CGContextRef
CGContextRef buffCtx;
UIImage* image;

- (id)initWithCoder:(NSCoder*)aCoder
{
    self = [super initWithCoder:aCoder];
    if (self) {
        // 初始化時(shí)將當(dāng)前顏色設(shè)為紅色
        self.currentColor = [UIColor redColor];
        // 創(chuàng)建內(nèi)存中的圖片
        UIGraphicsBeginImageContext(self.bounds.size);
        // 獲取向內(nèi)存中圖片執(zhí)行繪圖的CGContextRef
        buffCtx = UIGraphicsGetCurrentContext();
    }
    return self;
}
// 當(dāng)用戶手指開始觸碰時(shí)激發(fā)該方法
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    // 獲取觸碰點(diǎn)坐標(biāo)
    firstTouch = [touch locationInView: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 = [touches anyObject];
    // 獲取觸碰點(diǎn)坐標(biāo)
    lastTouch = [touch locationInView:self];
    // 如果當(dāng)前正在進(jìn)行自由繪制
    if (self.shape == kPenShape)
    {
        // 向內(nèi)存中的圖片執(zhí)行繪制
        [self draw:buffCtx];
        // 取出內(nèi)存中的圖片苟弛,保存到image中
        image = UIGraphicsGetImageFromCurrentImageContext();
    }
    // 通知該控件重繪酌伊,此時(shí)會(huì)實(shí)時(shí)地繪制起始點(diǎn)與用戶手指拖動(dòng)點(diǎn)之間的形狀
    [self setNeedsDisplay];
}
// 當(dāng)用戶手指離開控件時(shí)激發(fā)該方法
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    // 獲取離開觸碰的點(diǎn)坐標(biāo)
    lastTouch = [touch locationInView:self];
    // 向內(nèi)存中的圖片執(zhí)行繪制,即把最終確定圖形繪制到內(nèi)存中圖片上
    [self draw:buffCtx];
    image = UIGraphicsGetImageFromCurrentImageContext();
    // 通知重繪。
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect
{
    // 獲取繪圖上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 將內(nèi)存中的圖片繪制出來
    [image drawAtPoint:CGPointZero];
    // 調(diào)用draw:方法執(zhí)行繪制
    [self draw:ctx];
}
// 定義一個(gè)函數(shù)敦腔,用于根據(jù)firstTouch缆八、lastTouch來確定矩形區(qū)域
- (CGRect) curRect
{
    return CGRectMake(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;
        case klineShape:
            // 添加從firstTouch到lastTouch的路徑
            CGContextMoveToPoint(ctx, firstTouch.x, firstTouch.y);
            CGContextAddLineToPoint(ctx, lastTouch.x, lastTouch.y);
            // 繪制路徑
            CGContextStrokePath(ctx);
            break;
        case krectShape:
            // 填充矩形
            CGContextFillRect(ctx ,[self curRect]);
            break;
        case kEillpseShape:
            // 填充橢圓
            CGContextFillEllipseInRect(ctx ,[self curRect]);
            break;
        case kRoundRectShape:
            // 計(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;
        case kPenShape:
            // 添加從prevTouch到lastTouch的路徑
            CGContextMoveToPoint(ctx, prevTouch.x, prevTouch.y);
            CGContextAddLineToPoint(ctx, lastTouch.x, lastTouch.y);
            // 繪制路徑
            CGContextStrokePath(ctx);
            // 使用prevTouch保存當(dāng)前點(diǎn)
            prevTouch = lastTouch;
            break;
    }
}
@interface ViewController ()
{
    NSArray *colors;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    colors = [NSArray arrayWithObjects:
              [UIColor redColor],[UIColor greenColor],
              [UIColor blueColor],[UIColor yellowColor],
              [UIColor purpleColor],[UIColor cyanColor],
              [UIColor blackColor] , nil];
    // Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)changeColor:(UISegmentedControl *)sender {
    // 根據(jù)用戶的選擇來修改FKDrawView的當(dāng)前顏色
    ((GSCDrawView*)self.view).currentColor = [colors objectAtIndex:sender.selectedSegmentIndex];
}
- (IBAction)changeShape:(UISegmentedControl *)sender {
    
    // 修改FKDrawView控件的shape屬性
    ((GSCDrawView*)self.view).shape = sender.selectedSegmentIndex;

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蛔琅,隨后出現(xiàn)的幾起案子胎许,更是在濱河造成了極大的恐慌,老刑警劉巖罗售,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辜窑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡寨躁,警方通過查閱死者的電腦和手機(jī)穆碎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來职恳,“玉大人所禀,你說我怎么就攤上這事》徘眨” “怎么了色徘?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)操禀。 經(jīng)常有香客問我褂策,道長(zhǎng),這世上最難降的妖魔是什么颓屑? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任斤寂,我火速辦了婚禮,結(jié)果婚禮上揪惦,老公的妹妹穿的比我還像新娘遍搞。我一直安慰自己,他們只是感情好丹擎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布尾抑。 她就那樣靜靜地躺著,像睡著了一般蒂培。 火紅的嫁衣襯著肌膚如雪再愈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天护戳,我揣著相機(jī)與錄音翎冲,去河邊找鬼。 笑死媳荒,一個(gè)胖子當(dāng)著我的面吹牛抗悍,可吹牛的內(nèi)容都是我干的驹饺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缴渊,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赏壹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衔沼,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝌借,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后指蚁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菩佑,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年凝化,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稍坯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搓劫,死狀恐怖瞧哟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情糟把,我是刑警寧澤绢涡,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站遣疯,受9級(jí)特大地震影響雄可,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缠犀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一数苫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辨液,春花似錦虐急、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至燎悍,卻和暖如春敬惦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谈山。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工俄删, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓畴椰,卻偏偏與公主長(zhǎng)得像臊诊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子斜脂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評(píng)論 25 707
  • 序 在百度和簡(jiǎn)書上找到很多實(shí)現(xiàn)的代碼抓艳。找到的實(shí)現(xiàn)方式對(duì)于剛接觸的人來說,很亂秽褒,很多方式壶硅。為何呢:因?yàn)閷?shí)現(xiàn)畫圖的代碼...
    雙鯰魚閱讀 1,198評(píng)論 0 6
  • 前言 過年了,老家卻沒有網(wǎng)销斟,用的朋友家的wifi,信號(hào)很不穩(wěn)定椒舵,相當(dāng)不爽蚂踊。正好最近也有點(diǎn)郁悶,作為一個(gè)搬磚的人笔宿,倒...
    _onePiece閱讀 603評(píng)論 0 3
  • 0 CGContextRef context = UIGraphicsGetCurrentContext(); 設(shè)...
    豎著走的大閘蟹閱讀 516評(píng)論 1 3
  • 1 今天早上,我約了一個(gè)講形象設(shè)計(jì)的行家炬灭,聊我的發(fā)型問題醋粟。 我的頭發(fā)一直是我的老大難問題,又扎不住重归,又不乖巧米愿,綁個(gè)...
    小荻老師閱讀 380評(píng)論 1 2