iOS-UIBezierPath和各種layer把我玩壞了

關(guān)于UIBezierPath基礎(chǔ)

UIBezierPath對(duì)象是CGPathRef數(shù)據(jù)類型的封裝铅乡。path如果是基于矢量形狀的愕够,都用直線和曲線段去創(chuàng)建。我們使用直線段去創(chuàng)建矩形和多邊形抄淑,使用曲線段去創(chuàng)建挥摹(arc)遮咖,圓或者其他復(fù)雜的曲線形狀滩字。每一段都包括一個(gè)或者多個(gè)點(diǎn),繪圖命令定義如何去詮釋這些點(diǎn)御吞。每一個(gè)直線段或者曲線段的結(jié)束的地方是下一個(gè)的開始的地方麦箍。每一個(gè)連接的直線或者曲線段的集合成為subpath。一個(gè)UIBezierPath對(duì)象定義一個(gè)完整的路徑包括一個(gè)或者多個(gè)subpaths陶珠。

*** 首先我們需要自定義一個(gè)View繼承UIView??,用來繪制曲線 ***
1.創(chuàng)建一個(gè)三角形

- (void)drawRect:(CGRect)rect {
    
    // 1. 創(chuàng)建UIBezierPath對(duì)象
    UIBezierPath *path = [UIBezierPath bezierPath];
    // 2. 設(shè)置相關(guān)屬性
    path.lineWidth = 3.0f;               // 線條寬度
    [[UIColor redColor] set];            // 線條顏色
    path.lineCapStyle = kCGLineCapRound; // 線條拐角
    path.lineJoinStyle = kCGLineCapRound;// 終點(diǎn)處理
    // 3.通過moveToPoint:設(shè)置起點(diǎn)
    [path moveToPoint:CGPointMake(200, 200)];
    // 添加line為subPaths
    [path addLineToPoint:(CGPointMake(100, 400))];
    [path addLineToPoint:(CGPointMake(300, 400))];
    [path closePath];
    // 開始繪畫
    [path stroke];
    // 開始繪畫并填充
   //[path fill];

}

關(guān)于stroke和fill的效果圖如下


stroke效果

fill效果.png

2.創(chuàng)建矩形,圓形,和一段弧線

- (void)drawRect:(CGRect)rect {
    
    // 創(chuàng)建矩形
    UIBezierPath *rectPath = [UIBezierPath bezierPathWithRect:(CGRectMake(50, 100, 100, 100))];
    rectPath.lineWidth = 3.0f;
    [[UIColor redColor] set];
    rectPath.lineCapStyle = kCGLineCapRound;
    rectPath.lineJoinStyle = kCGLineCapRound;
    [rectPath stroke];
    
    // 創(chuàng)建內(nèi)切圓
    UIBezierPath *oval = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 300, 300, 300)];
    oval.lineWidth = 3.0f;
    [[UIColor greenColor] set];
    oval.lineCapStyle = kCGLineCapRound;
    oval.lineJoinStyle = kCGLineCapRound;
    [oval stroke];
    
    // 弧線
    CGFloat endAngle = 120 *sinf(M_PI / 180);
    UIBezierPath *arcPath = [UIBezierPath bezierPathWithArcCenter:(CGPointMake(300, 100)) radius:100 startAngle:0.0 endAngle:endAngle clockwise:YES];
    arcPath.lineWidth = 5.0f;
    [[UIColor purpleColor] set];
    arcPath.lineCapStyle = kCGLineCapRound;
    arcPath.lineJoinStyle = kCGLineCapRound;
    [arcPath stroke];
}

附上效果圖:

CAShapeLayer和CAGradientLayer

  • CAShapeLayer是一個(gè)通過矢量圖形而不是bitmap來繪制的圖層子類挟裂。可以指定顏色和線寬等屬性揍诽,用CGPath來描述繪制的圖形.
  • CAGradientLayer,蘋果給出的官方描述是:一個(gè)可以用來進(jìn)行繪制##漸變背景色的layer
實(shí)戰(zhàn)一:寫一個(gè)環(huán)形的進(jìn)度條

1.先通過CAShapeLayer和BezierPath創(chuàng)建一個(gè)圓形的進(jìn)度條出來

- (void)viewDidLoad {
    [super viewDidLoad];

 // 創(chuàng)建曲線,繪制圓形path
    UIBezierPath *circlePath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.view.center.x, self.view.center.y) radius:100 startAngle:M_PI endAngle:-M_PI clockwise:NO];
    // 創(chuàng)建shapeLayer
    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    shapeLayer.frame = self.view.bounds;// 設(shè)置圖層大小
    shapeLayer.path = circlePath.CGPath;// 設(shè)置shapeLayer的cgPath
    shapeLayer.opacity = 1.0f;  //設(shè)置透明度0~1之間
    shapeLayer.lineCap = kCALineCapRound;//制定線的邊緣是圓形
    shapeLayer.lineWidth = 5.0f; // 設(shè)置線寬
    shapeLayer.strokeColor = [UIColor lightGrayColor].CGColor;// 設(shè)置線條顏色
    [shapeLayer setFillColor:[UIColor clearColor].CGColor]; // 清楚填充顏色
    [self.view.layer addSublayer:shapeLayer];}
效果圖??

2.創(chuàng)建CAGradientLayer設(shè)置漸變顏色

    // 創(chuàng)建顏色數(shù)組
    NSMutableArray *colors = [NSMutableArray array];
    for (NSInteger hue = 0; hue <= 360; hue += 5)
    {
        UIColor * color = [UIColor colorWithHue:1.0 * hue / 360
                                     saturation:1.0
                                     brightness:1.0
                                          alpha:1.0];
        [colors addObject:(id)[color CGColor]];
    }

    
    CAGradientLayer *grandient = [CAGradientLayer layer];
    grandient.frame = self.view.bounds;//設(shè)置顏色漸變的layer的frame
    grandient.colors = colors;//顏色數(shù)組
    grandient.mask = shapeLayer;//設(shè)置mask圖層
    //開始和結(jié)束點(diǎn)可以用來做隱式動(dòng)畫
    grandient.startPoint = CGPointMake(0, 0);//開始點(diǎn)
    grandient.endPoint = CGPointMake(1, 0);//結(jié)束點(diǎn)
    [self.view.layer addSublayer:grandient];
    效果圖??
關(guān)于隱式動(dòng)畫
shapeLayer.strokeStart =0.f;
shapeLayer.strokeEnd = 0.f;
__block CGFloat end = 0.0f;
 [NSTimer scheduledTimerWithTimeInterval:0.2 repeats:YES block:^(NSTimer * _Nonnull timer) {
        end += 0.1f;
        if (end >= 1) {
            [timer invalidate];
        }
        shapeLayer.strokeEnd = end;
    }];

Tips:我自己寫了一個(gè)圖表的Demo,大神們不要嫌棄~先上個(gè)效果圖

ab.gif

GIT地址:https://github.com/candy7/Graphs

~~~ 給個(gè)?喜歡?吧,謝謝各位看官了.= ̄ω ̄=~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诀蓉,一起剝皮案震驚了整個(gè)濱河市栗竖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渠啤,老刑警劉巖狐肢,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沥曹,居然都是意外死亡份名,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門妓美,熙熙樓的掌柜王于貴愁眉苦臉地迎上來僵腺,“玉大人,你說我怎么就攤上這事壶栋〕饺纾” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵委刘,是天一觀的道長丧没。 經(jīng)常有香客問我,道長锡移,這世上最難降的妖魔是什么呕童? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮淆珊,結(jié)果婚禮上夺饲,老公的妹妹穿的比我還像新娘。我一直安慰自己施符,他們只是感情好往声,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著戳吝,像睡著了一般浩销。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上听哭,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天慢洋,我揣著相機(jī)與錄音,去河邊找鬼陆盘。 笑死普筹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隘马。 我是一名探鬼主播太防,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼酸员!你這毒婦竟也來了蜒车?” 一聲冷哼從身側(cè)響起讳嘱,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎醇王,沒想到半個(gè)月后呢燥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寓娩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年叛氨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棘伴。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寞埠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出焊夸,到底是詐尸還是另有隱情仁连,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布阱穗,位于F島的核電站饭冬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏揪阶。R本人自食惡果不足惜昌抠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鲁僚。 院中可真熱鬧炊苫,春花似錦、人聲如沸冰沙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拓挥。三九已至唠梨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侥啤,已是汗流浹背当叭。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愿棋,地道東北人科展。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓均牢,卻偏偏與公主長得像糠雨,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子徘跪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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