日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UIBezierPath

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UIBezierPath 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習UIBezierPath畫圖


筆者在寫本篇文章之前,也沒有系統學習過貝塞爾曲線,只是曾經某一次的需求需要使用到,才臨時百度看了一看而且使用最基本的功能。現在總算有時間停下來好好研究研究這個神奇而偉大的貝塞爾先生!

筆者在學習時,首先看了兩遍UIBezierPath類頭文件定義,熟悉了一下相關的屬性和方法。

支持原創,請閱讀原文

基礎知識


使用UIBezierPath可以創建基于矢量的路徑,此類是Core Graphics框架關于路徑的封裝。使用此類可以定義簡單的形狀,如橢圓、矩形或者有多個直線和曲線段組成的形狀等。

UIBezierPath是CGPathRef數據類型的封裝。如果是基于矢量形狀的路徑,都用直線和曲線去創建。我們使用直線段去創建矩形和多邊形,使用曲線去創建圓弧(arc)、圓或者其他復雜的曲線形狀。

使用UIBezierPath畫圖步驟:

  • 創建一個UIBezierPath對象
  • 調用-moveToPoint:設置初始線段的起點
  • 添加線或者曲線去定義一個或者多個子路徑
  • 改變UIBezierPath對象跟繪圖相關的屬性。如,我們可以設置畫筆的屬性、填充樣式等
  • UIBezierPath創建方法介紹


    我們先看看UIBezierPath類提供了哪些創建方式,這些都是工廠方法,直接使用即可。

    + (instancetype)bezierPath; + (instancetype)bezierPathWithRect:(CGRect)rect; + (instancetype)bezierPathWithOvalInRect:(CGRect)rect; + (instancetype)bezierPathWithRoundedRect:(CGRect)rectcornerRadius:(CGFloat)cornerRadius; + (instancetype)bezierPathWithRoundedRect:(CGRect)rectbyRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii; + (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise; + (instancetype)bezierPathWithCGPath:(CGPathRef)CGPath;

    下面我們一個一個地介紹其用途。

    + (instancetype)bezierPath;

    這個使用比較多,因為這個工廠方法創建的對象,我們可以根據我們的需要任意定制樣式,可以畫任何我們想畫的圖形。

    + (instancetype)bezierPathWithRect:(CGRect)rect;

    這個工廠方法根據一個矩形畫貝塞爾曲線。

    + (instancetype)bezierPathWithOvalInRect:(CGRect)rect;

    這個工廠方法根據一個矩形畫內切曲線。通常用它來畫圓或者橢圓。

    + (instancetype)bezierPathWithRoundedRect:(CGRect)rectcornerRadius:(CGFloat)cornerRadius; + (instancetype)bezierPathWithRoundedRect:(CGRect)rectbyRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii;

    第一個工廠方法是畫矩形,但是這個矩形是可以畫圓角的。第一個參數是矩形,第二個參數是圓角大小。
    第二個工廠方法功能是一樣的,但是可以指定某一個角畫成圓角。像這種我們就可以很容易地給UIView擴展添加圓角的方法了。

    + (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;

    這個工廠方法用于畫弧,參數說明如下:
    center: 弧線中心點的坐標
    radius: 弧線所在圓的半徑
    startAngle: 弧線開始的角度值
    endAngle: 弧線結束的角度值
    clockwise: 是否順時針畫弧線

    溫馨提示:我們下面的代碼都是在自定義的BezierPathView類中的- (void)drawRect:(CGRect)rect方法中調用

    畫三角形


    先看效果圖:


    image // 畫三角形 - (void)drawTrianglePath {UIBezierPath *path = [UIBezierPath bezierPath];[path moveToPoint:CGPointMake(20, 20)];[path addLineToPoint:CGPointMake(self.frame.size.width - 40, 20)];[path addLineToPoint:CGPointMake(self.frame.size.width / 2, self.frame.size.height - 20)];// 最后的閉合線是可以通過調用closePath方法來自動生成的,也可以調用-addLineToPoint:方法來添加// [path addLineToPoint:CGPointMake(20, 20)];[path closePath];// 設置線寬path.lineWidth = 1.5;// 設置填充顏色UIColor *fillColor = [UIColor greenColor];[fillColor set];[path fill];// 設置畫筆顏色UIColor *strokeColor = [UIColor blueColor];[strokeColor set];// 根據我們設置的各個點連線[path stroke]; }

    我們設置畫筆顏色通過set方法:

    UIColor *strokeColor = [UIColor blueColor]; [strokeColor set];

    如果我們需要設置填充顏色,比如這里設置為綠色,那么我們需要在設置畫筆顏色之前先設置填充顏色,否則畫筆顏色就被填充顏色替代了。也就是說,如果要讓填充顏色與畫筆顏色不一樣,那么我們的順序必須是先設置填充顏色再設置畫筆顏色。如下,這兩者順序不能改變。因為我們設置填充顏色也是跟設置畫筆顏色一樣調用UIColor的-set方法。

    // 設置填充顏色 UIColor *fillColor = [UIColor greenColor]; [fillColor set]; [path fill];// 設置畫筆顏色 UIColor *strokeColor = [UIColor blueColor]; [strokeColor set];

    畫矩形


    先看效果圖:


    image // 畫矩形 - (void)drawRectPath {UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(20, 20, self.frame.size.width - 40, self.frame.size.height - 40)];path.lineWidth = 1.5;path.lineCapStyle = kCGLineCapRound;path.lineJoinStyle = kCGLineJoinBevel;// 設置填充顏色UIColor *fillColor = [UIColor greenColor];[fillColor set];[path fill];// 設置畫筆顏色UIColor *strokeColor = [UIColor blueColor];[strokeColor set];// 根據我們設置的各個點連線[path stroke]; }

    lineCapStyle屬性是用來設置線條拐角帽的樣式的,其中有三個選擇:

    /* Line cap styles. */typedef CF_ENUM(int32_t, CGLineCap) {kCGLineCapButt,kCGLineCapRound,kCGLineCapSquare };

    其中,第一個是默認的,第二個是輕微圓角,第三個正方形。

    lineJoinStyle屬性是用來設置兩條線連結點的樣式,其中也有三個選擇:

    /* Line join styles. */typedef CF_ENUM(int32_t, CGLineJoin) {kCGLineJoinMiter,kCGLineJoinRound,kCGLineJoinBevel };

    其中,第一個是默認的表示斜接,第二個是圓滑銜接,第三個是斜角連接。

    畫圓


    我們可以使用+ bezierPathWithOvalInRect:方法來畫圓,當我們傳的rect參數是一下正方形時,畫出來的就是圓。

    先看效果圖:


    image - (void)drawCiclePath {// 傳的是正方形,因此就可以繪制出圓了UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(20, 20, self.frame.size.width - 40, self.frame.size.width - 40)];// 設置填充顏色UIColor *fillColor = [UIColor greenColor];[fillColor set];[path fill];// 設置畫筆顏色UIColor *strokeColor = [UIColor blueColor];[strokeColor set];// 根據我們設置的各個點連線[path stroke]; }

    注意:要畫圓,我們需要傳的rect參數必須是正方形哦!

    畫橢圓


    先看效果圖:


    image

    前面我們已經畫圓了,我們可以使用+ bezierPathWithOvalInRect:方法來畫圓,當我們傳的rect參數是一下正方形時,畫出來的就是圓。那么我們要是不傳正方形,那么繪制出來的就是橢圓了。

    // 畫橢圓 - (void)drawOvalPath {// 傳的是不是正方形,因此就可以繪制出橢圓圓了UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(20, 20, self.frame.size.width - 80, self.frame.size.height - 40)];// 設置填充顏色UIColor *fillColor = [UIColor greenColor];[fillColor set];[path fill];// 設置畫筆顏色UIColor *strokeColor = [UIColor blueColor];[strokeColor set];// 根據我們設置的各個點連線[path stroke]; }

    畫帶圓角的矩形


    + (instancetype)bezierPathWithRoundedRect:(CGRect)rectcornerRadius:(CGFloat)cornerRadius; + (instancetype)bezierPathWithRoundedRect:(CGRect)rectbyRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii;

    第一個工廠方法是畫矩形,但是這個矩形是可以畫圓角的。第一個參數是矩形,第二個參數是圓角大小。
    第二個工廠方法功能是一樣的,但是可以指定某一個角畫成圓角。像這種我們就可以很容易地給UIView擴展添加圓角的方法了。

    四個都是圓角10:


    image - (void)drawRoundedRectPath {UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 20, self.frame.size.width - 40, self.frame.size.height - 40) cornerRadius:10];// 設置填充顏色UIColor *fillColor = [UIColor greenColor];[fillColor set];[path fill];// 設置畫筆顏色UIColor *strokeColor = [UIColor blueColor];[strokeColor set];// 根據我們設置的各個點連線[path stroke]; }

    如果要畫只有一個角是圓角,那么我們就修改創建方法:

    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 20, self.frame.size.width - 40, self.frame.size.height - 40) byRoundingCorners:UIRectCornerTopRight cornerRadii:CGSizeMake(20, 20)];

    其中第一個參數一樣是傳了個矩形,第二個參數是指定在哪個方向畫圓角,第三個參數是一個CGSize類型,用來指定水平和垂直方向的半徑的大小。看下效果圖:


    image

    畫弧


    畫弧前,我們需要了解其參考系,如下圖(圖片來自網絡):


    image #define kDegreesToRadians(degrees) ((pi * degrees)/ 180) - (void)drawARCPath {const CGFloat pi = 3.14159265359;CGPoint center = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2);UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:centerradius:100startAngle:0endAngle:kDegreesToRadians(135)clockwise:YES];path.lineCapStyle = kCGLineCapRound;path.lineJoinStyle = kCGLineJoinRound;path.lineWidth = 5.0;UIColor *strokeColor = [UIColor redColor];[strokeColor set];[path stroke]; }

    效果圖如下:


    image

    我們要明確一點,畫弧參數startAngle和endAngle使用的是弧度,而不是角度,因此我們需要將常用的角度轉換成弧度。對于效果圖中,我們設置弧的中心為控件的中心,起點弧度為0,也就是正東方向,而終點是135度角的位置。如果設置的clockwise:YES是逆時針方向繪制,如果設置為NO,效果如下:


    image

    這兩者正好是相反的。

    畫二次貝塞爾曲線


    先來學習一下關于控制點,如下圖(圖片來自網絡):


    image

    畫二次貝塞爾曲線,是通過調用此方法來實現的:

    - (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint

    參數說明:

    endPoint:終端點<br/>
    controlPoint:控制點,對于二次貝塞爾曲線,只有一個控制點

    看效果圖:


    image - (void)drawSecondBezierPath {UIBezierPath *path = [UIBezierPath bezierPath];// 首先設置一個起始點[path moveToPoint:CGPointMake(20, self.frame.size.height - 100)];// 添加二次曲線[path addQuadCurveToPoint:CGPointMake(self.frame.size.width - 20, self.frame.size.height - 100)controlPoint:CGPointMake(self.frame.size.width / 2, 0)];path.lineCapStyle = kCGLineCapRound;path.lineJoinStyle = kCGLineJoinRound;path.lineWidth = 5.0;UIColor *strokeColor = [UIColor redColor];[strokeColor set];[path stroke]; }

    畫二次貝塞爾曲線的步驟:

  • 先設置一個起始點,也就是通過-moveToPoint:設置
  • 調用-addQuadCurveToPoint:controlPoint:方法設置終端點和控制點,以畫二次曲線
  • 在效果圖中,拱橋左邊的起始點就是我們設置的起始點,最右邊的終點,就是我們設置的終端點,而我們設置的控制點為(width / 2, 0)對應于紅色矩形中水平方向在正中央,而垂直方向在最頂部。

    這個樣式看起來很像sin或者cos函數吧?這兩個只是特例而已,其實可以畫任意圖形,只是想不到,沒有做不到的。

    畫三次貝塞爾曲線


    貝塞爾曲線必定通過首尾兩個點,稱為端點;中間兩個點雖然未必要通過,但卻起到牽制曲線形狀路徑的作用,稱作控制點。關于三次貝塞爾曲線的控制器,看下圖:


    image

    提示:其組成是起始端點+控制點1+控制點2+終止端點

    如下方法就是畫三次貝塞爾曲線的關鍵方法,以三個點畫一段曲線,一般和-moveToPoint:配合使用。

    - (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2

    看下效果圖:


    image

    實現代碼是這樣的:

    - (void)drawThirdBezierPath {UIBezierPath *path = [UIBezierPath bezierPath];// 設置起始端點[path moveToPoint:CGPointMake(20, 150)];[path addCurveToPoint:CGPointMake(300, 150)controlPoint1:CGPointMake(160, 0)controlPoint2:CGPointMake(160, 250)];path.lineCapStyle = kCGLineCapRound;path.lineJoinStyle = kCGLineJoinRound;path.lineWidth = 5.0;UIColor *strokeColor = [UIColor redColor];[strokeColor set];[path stroke]; }

    我們需要注意,這里確定的起始端點為(20,150),終止端點為(300, 150),基水平方向是一致的。控制點1的坐標是(160,0),水平方向相當于在中間附近,這個參數可以調整。控制點2的坐標是(160,250),如果以兩個端點的連線為水平線,那么就是250-150=100,也就是在水平線下100。這樣看起來就像一個sin函數了。



    文/標哥的技術博客(簡書作者)
    原文鏈接:http://www.jianshu.com/p/734b34e82135
    著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。

    總結

    以上是生活随笔為你收集整理的UIBezierPath的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。