石英2D

Quartz2D

  • 在 - (void)drawRect:(CGRect)rect方法里面實(shí)現(xiàn)添加一個(gè)根線
  • 基本步驟
    • 1.獲取上下文->2.描述路徑->3.把路徑添加到上下文->4.把上下文的內(nèi)容渲染到View的layer.
//作用:繪圖(該方法是UIView的方法溺拱,所以凡是UIView的子類都擁有术奖,都可以實(shí)現(xiàn))
//什么時(shí)候調(diào)用:(系統(tǒng)自動(dòng)調(diào)用)當(dāng)View顯示的時(shí)候調(diào)用
//參數(shù):當(dāng)前View的bounds
//在drawRect系統(tǒng)已經(jīng)自動(dòng)創(chuàng)建了一個(gè)跟當(dāng)前View相關(guān)聯(lián)的上下文
- (void)drawRect:(CGRect)rect {

      //1.獲取跟View相關(guān)聯(lián)的上下文(uigraphics開(kāi)頭)
//    CGContextRef ctx =  UIGraphicsGetCurrentContext();
      //2.描述路徑
//    UIBezierPath *path = [UIBezierPath bezierPath];
      //設(shè)置起點(diǎn)
//    [path moveToPoint:CGPointMake(50, 250)];

      //添加一根曲線到某個(gè)點(diǎn)
//    [path addQuadCurveToPoint:CGPointMake(250, 250) controlPoint:CGPointMake(80, 100)];

      //3.把路徑添加到上下文
//    CGContextAddPath(ctx, path.CGPath);

      //4.把上下文內(nèi)容渲染到View上.
//    CGContextStrokePath(ctx);

    //在drawRect系統(tǒng)已經(jīng)自動(dòng)創(chuàng)建了一個(gè)跟當(dāng)前View相關(guān)聯(lián)的上下文,所以只要添加上路徑就可以了
    UIBezierPath *path = [UIBezierPath bezierPath];
    //設(shè)置起點(diǎn)
    [path moveToPoint:CGPointMake(50, 150)];
    //添加一根線到某個(gè)點(diǎn)
    [path addLineToPoint:CGPointMake(250, 50)];

    [path setLineWidth:10];
    [path setLineCapStyle:kCGLineCapRound];
    [[UIColor redColor] set];
    [path stroke];

    // 自定義的方法中是實(shí)現(xiàn)添加一根線
//    [self drawLine];
}
  • 自定義方法中實(shí)現(xiàn)view的添加一根線的方法
//畫直線(也可以畫曲線)
- (void)drawLine {

    //1.獲取跟View相關(guān)聯(lián)的上下文(uigraphics開(kāi)頭)
    CGContextRef context = UIGraphicsGetCurrentContext();

    //2.描述路徑
    //一條路徑可以繪制多條線
    UIBezierPath *path = [UIBezierPath bezierPath];
    //設(shè)置起點(diǎn)
    [path moveToPoint:CGPointMake(50, 150)];
    //添加一根線到某個(gè)點(diǎn)
    [path addLineToPoint:CGPointMake(250, 50)];

    //畫第二根線
    //[path moveToPoint:CGPointMake(50, 250)];
    //[path addLineToPoint:CGPointMake(250, 100)];

    //把上一條路徑的終點(diǎn),當(dāng)作是下一個(gè)路徑的起點(diǎn)
    [path addLineToPoint:CGPointMake(50, 250)];

    //設(shè)置上下文的狀態(tài)
    // 設(shè)置線寬
    CGContextSetLineWidth(context, 10);
    //設(shè)置線的連接樣式
    CGContextSetLineJoin(context, kCGLineJoinMiter);
    //設(shè)置線的頂角樣式
    CGContextSetLineCap(context, kCGLineCapRound);
    //設(shè)置顏色(Sets the fill and stroke colors in the current drawing context.)
    [[UIColor redColor] set];

    //3.把路徑添加到上下文
    //UIBezierPath->UIKit -->  CGPathRef->CoreGraphics
    CGContextAddPath(context, path.CGPath);

    //4.把上下文當(dāng)中繪制的內(nèi)容渲染到跟View關(guān)聯(lián)的layer.(stroke ,fill)
    CGContextStrokePath(context);
}
  • 畫圓
- (void)drawRect:(CGRect)rect {

    //描述一個(gè)橢圓
    //UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 200, 200)];
    //繪制路徑
    //[[UIColor yellowColor] set];
    //[path fill];

    //畫弧
    //Center:弧所在的圓心
    //radius:圓的半徑
    //startAngle:開(kāi)始角度,圓的最右側(cè)為0度
    //endAngle:截至角度,向下為正,向上為負(fù).
    //clockwise:時(shí)針的方向,yes:順時(shí)針 no:逆時(shí)針


    //CGPoint center = CGPointMake(rect.size.width * 0.5, rect.size.height * 0.5);
    CGFloat radius = rect.size.width * 0.5 - 10;
    CGFloat startA = 0;
    CGFloat endA = -M_PI_2;
    //畫弧的路徑
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:self.center radius:radius startAngle:startA endAngle:endA clockwise:NO];

    //畫扇形
    //添加一根線到圓心
    [path addLineToPoint:self.center];
    //關(guān)閉路徑(自動(dòng)的從路徑的終點(diǎn)連接到路徑的起點(diǎn))
    //[path closePath];
    [[UIColor redColor] set];
    //使用fill在填充之前,自動(dòng)的關(guān)閉路徑
    [path fill];


    //1.獲取上下文->2.描述路徑->3.把路徑添加到上下文->4.把上下文的內(nèi)容渲染到View的layer.

}

//畫矩形
- (void)drawRect {
    //1.獲取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    //2.描述路徑
    //矩形
    //UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(50, 50, 200, 200)];
    //畫圓角矩形
    //cornerRadius:圓角半徑
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(50, 50, 200, 200) cornerRadius:100];

    //3.把路徑添加到上下文
    CGContextAddPath(ctx, path.CGPath);

    [[UIColor redColor] set];

    //4.把上下文的內(nèi)容渲染到View的layer.
    //CGContextStrokePath(ctx);
    CGContextFillPath(ctx);
}

b貝曲爾曲線畫餅圖

  • 步驟
    • 設(shè)置圓心的位置center(CGPoint)
    • 設(shè)置開(kāi)始的角度startAngle(CGFloat)月培,這其中涉及到數(shù)字轉(zhuǎn)換為角度(num.intValue / 100.0 * M_PI * 2;)
    • 使用貝曲爾曲線畫圓
- (void)drawRect:(CGRect)rect {
    // Drawing code

     NSArray *dataArray =  @[@25,@25,@50];

    //畫弧
    CGPoint center = CGPointMake(rect.size.width * 0.5, rect.size.height * .5);
    CGFloat radius = rect.size.width * 0.5 - 10;

    // 初始化角度
    CGFloat startA = 0;
    CGFloat angle = 0;
    CGFloat endA = 0;

    // 從數(shù)組中讀取到每個(gè)圓所占的比例
    for (NSNumber *num in dataArray) {

        startA = endA;
        //轉(zhuǎn)換為角度
        angle = num.intValue / 100.0 * M_PI * 2;
        endA = startA + angle;

        // 使用貝曲爾曲線畫圓
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES];
        // 曲線的顏色
        [[self randomColor] set];
        //添加一根線到圓心
        [path addLineToPoint:center];
        // 自動(dòng)閉合
        [path fill];
    }
}

雪花效果

- (void)awakeFromNib {

    //添加定時(shí)器
    //[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(update) userInfo:nil repeats:YES];

    //什么時(shí)候調(diào)用指定的方法?
    //當(dāng)下一次屏幕刷新時(shí)調(diào)用(屏幕每一秒刷新60)
    CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(update)];

    //想要讓CADisplayLink工作, 必須得要添加到主運(yùn)行循環(huán)當(dāng)中.
    [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

    //setNeedsDisplay底層會(huì)調(diào)用drawRect,并不是立馬調(diào)用的.只是設(shè)了一個(gè)調(diào)用的標(biāo)志.
    //等下一次屏幕刷新時(shí)才去調(diào)用drawRect
}

static int _snowY = 0;
- (void)update {

    _snowY += 10;
    if (_snowY > self.bounds.size.height) {
        _snowY = 0;
    }

    //重繪
    [self setNeedsDisplay];

}

// 三個(gè)方法的調(diào)用順序:
// 首先會(huì)調(diào)用awakeFromNib恼策,在里面設(shè)置屏幕的刷新率瞭稼,然后在顯示view的時(shí)候調(diào)用了drawRect:(CGRect)rect方法,添加了一張雪花的圖片绘面,然后屏幕在刷新的時(shí)候調(diào)用了update 的方法欺税,每一次調(diào)用的時(shí)候都會(huì)進(jìn)行重繪,重繪時(shí)又調(diào)用drawRect:(CGRect)rect 方法更新圖片的y 位置

- (void)drawRect:(CGRect)rect {

    //加載圖片
    UIImage *image = [UIImage imageNamed:@"雪花"];
    [image drawAtPoint:CGPointMake(0, _snowY)];

}

圖片加水印

  • 不僅圖片可以繪畫到圖形上下文中揭璃,NSString字符串也可以
- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor yellowColor];

    //生成一張圖片
    //0.加載圖片
    UIImage *oriImage = [UIImage imageNamed:@"小黃人"];

    //1.創(chuàng)建位圖上下文(size:開(kāi)啟多大的上下文,就會(huì)生成多大的圖片)
    UIGraphicsBeginImageContext(oriImage.size);
    //2.把圖片繪制到上下文當(dāng)中
    [oriImage drawAtPoint:CGPointZero]; // CGPointZero 在沒(méi)有完全確定位置的時(shí)候用CGPointZero代替
    //3.繪制水印
    NSString *str = @"小黃人";

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    dict[NSFontAttributeName] = [UIFont systemFontOfSize:20];
    dict[NSForegroundColorAttributeName] = [UIColor redColor];

    [str drawAtPoint:CGPointZero withAttributes:dict];
    //4.從上下文當(dāng)中生成一張圖片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    //5.關(guān)閉位圖上下文
    UIGraphicsEndImageContext();

    self.imageV.image = newImage;
}

利用貝曲爾曲線和圖形上下文裁剪圖片

- (void)viewDidLoad {
    [super viewDidLoad];

    //生成一張圓形圖片
    //0.加載圖片
    UIImage *oriImage =  [UIImage imageNamed:@"阿貍頭像"];
    //1.開(kāi)啟一個(gè)和圖片一樣大小的位圖上下文
    UIGraphicsBeginImageContext(oriImage.size);

    //2.設(shè)置一個(gè)裁剪區(qū)域(圓形)晚凿,從左上角開(kāi)始,
    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, oriImage.size.width, oriImage.size.height)];
    //把路徑設(shè)置成裁剪區(qū)域(超過(guò)裁剪區(qū)域以外的內(nèi)容會(huì)自動(dòng)被裁剪掉)
    [path addClip];

    //3.把圖片繪制到上下文當(dāng)中
    [oriImage drawAtPoint:CGPointZero];

    //4.從上下文當(dāng)中生成一張圖片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    //5.關(guān)閉上下文
    UIGraphicsEndImageContext();

    self.imageV.image = newImage;
}

圖片截屏

- (IBAction)pan:(UIPanGestureRecognizer *)pan {

    //獲取當(dāng)前手指所在的點(diǎn)
    CGPoint curP = [pan locationInView:self.imageV];

    //判斷手勢(shì)的狀態(tài)
    if(pan.state == UIGestureRecognizerStateBegan) {
        //記錄當(dāng)前手指的開(kāi)始點(diǎn)
        self.startP = curP;

    } else if(pan.state == UIGestureRecognizerStateChanged) {

        //rect
        CGFloat w = curP.x - self.startP.x;
        CGFloat h = curP.y - self.startP.y;
        CGRect rect = CGRectMake(self.startP.x, self.startP.y, w, h);

        self.coverView.frame = rect;

    }else if(pan.state == UIGestureRecognizerStateEnded) {

        //生成一張圖片
        UIGraphicsBeginImageContext(self.imageV.bounds.size);

        //設(shè)置裁剪區(qū)域
        UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.coverView.frame];
        [path addClip];

        //2.把UIImageV當(dāng)中的內(nèi)容渲染到上下文當(dāng)中
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        [self.imageV.layer renderInContext:ctx];

        //從上下文當(dāng)中獲取圖片
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

        //關(guān)閉上下文
        UIGraphicsEndImageContext();

        self.imageV.image = newImage;

        [self.coverView removeFromSuperview];
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瘦馍,一起剝皮案震驚了整個(gè)濱河市歼秽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌情组,老刑警劉巖燥筷,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扛吞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荆责,警方通過(guò)查閱死者的電腦和手機(jī)滥比,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)做院,“玉大人盲泛,你說(shuō)我怎么就攤上這事〖” “怎么了寺滚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)屈雄。 經(jīng)常有香客問(wèn)我村视,道長(zhǎng),這世上最難降的妖魔是什么酒奶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任蚁孔,我火速辦了婚禮,結(jié)果婚禮上惋嚎,老公的妹妹穿的比我還像新娘杠氢。我一直安慰自己,他們只是感情好另伍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布鼻百。 她就那樣靜靜地躺著,像睡著了一般摆尝。 火紅的嫁衣襯著肌膚如雪温艇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天堕汞,我揣著相機(jī)與錄音勺爱,去河邊找鬼。 笑死臼朗,一個(gè)胖子當(dāng)著我的面吹牛邻寿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播视哑,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼绣否,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了挡毅?” 一聲冷哼從身側(cè)響起蒜撮,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后段磨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體取逾,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年苹支,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砾隅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡债蜜,死狀恐怖晴埂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寻定,我是刑警寧澤儒洛,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站狼速,受9級(jí)特大地震影響琅锻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜向胡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一恼蓬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捷枯,春花似錦滚秩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)本股。三九已至攀痊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拄显,已是汗流浹背苟径。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躬审,地道東北人棘街。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像承边,于是被迫代替她去往敵國(guó)和親遭殉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • UIBezierPath Class Reference 譯:UIBezierPath類封裝了Core Graph...
    鋼鉄俠閱讀 1,706評(píng)論 0 3
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評(píng)論 25 707
  • 1.xcode5和xcode7區(qū)別 1.xcode7沒(méi)有Frameworks文件夾,xcode7內(nèi)部會(huì)自動(dòng)幫你導(dǎo)入...
    彼岸的黑色曼陀羅閱讀 505評(píng)論 0 2
  • Quartz2D以及drawRect的重繪機(jī)制字?jǐn)?shù)1487 閱讀21 評(píng)論1 喜歡1一博助、什么是Quartz2D Q...
    PurpleWind閱讀 760評(píng)論 0 3
  • 馮諾依曼體系 特點(diǎn): 必須有一個(gè)存儲(chǔ)器必須有一個(gè)控制器必須有一個(gè)運(yùn)算器险污,用于完成算術(shù)運(yùn)算和邏輯運(yùn)算必須有輸入和輸出...
    大海孤了島閱讀 437評(píng)論 0 0