UIBezierPath

weixin_33912445發表於2017-07-11

一個由直線和曲線線段組成的路徑,可以在自定義檢視中呈現,UIKit中的UIBezierPath是Core Graphics框架關於path的一個封裝。可以建立基於向量的路徑,例如橢圓或者矩形,或者有多個直線和曲線段組成的形狀

  • 建立一個UIBezierPath物件

  • bezierPath

1.建立並返回一個新的UIBezierPath物件

  • bezierPathWithRect:

1.以矩形路徑初始化建立並返回一個新的UIBezierPath物件

   //畫矩形
    UIBezierPath * recPath=[UIBezierPath bezierPathWithRect:CGRectMake(10, 50, 50, 50)];
    //線的寬度
    recPath.lineWidth=3;
    
    [recPath fill];
  • bezierPathWithOvalInRect:

1.以橢圓路徑初始化建立並返回一個新的UIBezierPath物件

UIBezierPath * ovalPath =[UIBezierPath bezierPathWithOvalInRect:CGRectMake(10, 130, 80, 50)];
    [ovalPath stroke];
  • bezierPathWithRoundedRect:cornerRadius:

1.以圓角矩形路徑初始化建立並返回一個新的UIBezierPath物件

UIBezierPath * recRoundPath=[UIBezierPath bezierPathWithRoundedRect:CGRectMake(10, 200, 80, 50) cornerRadius:10];
    [recRoundPath stroke];
  • bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:

1.以可選哪個角為圓角矩形路徑初始化建立並返回一個新的UIBezierPath物件

 UIBezierPath * recRoundCorPath=[UIBezierPath bezierPathWithRoundedRect:CGRectMake(10, 270, 80, 50) byRoundingCorners:UIRectCornerTopLeft|UIRectCornerBottomRight cornerRadii:CGSizeMake(20, 20)];
    [recRoundCorPath stroke];
  • bezierPathWithArcCenter:radius:startAngle:endAngle:clockwise:

1.以圓弧路徑初始化建立並返回一個新的UIBezierPath物件

/*
     // 引數一: 圓弧圓心
     // 引數二: 圓弧半徑
     // 引數三: 開始弧度
     // 引數四: 結束弧度
     // 引數五: 是否為順時針
     */
    UIBezierPath * arcPath=[UIBezierPath bezierPathWithArcCenter:CGPointMake(80, 390) radius:60 startAngle:0 endAngle:M_PI/2 clockwise:NO];
    [arcPath fill];
  • bezierPathWithCGPath:

1.以Core Graphics path的路徑為引數建立並返回一個新的UIBezierPath物件

  • bezierPathByReversingPath

1.使用當前路徑的反向內容建立和返回一個新的貝塞爾路徑物件

  • 構建路徑

  • moveToPoint:

1.將當前點移動到指定的位置

  • addLineToPoint:

1.從當前點增加一條直線到指定點

UIBezierPath * linePath = [UIBezierPath bezierPath];
[linePath moveToPoint:CGPointMake(100, 10)]; [linePath addLineToPoint:CGPointMake(150, 100)];
[linePath stroke];
  • addArcWithCenter:radius:startAngle:endAngle:clockwise:

1.在路徑中增加一條圓弧

UIBezierPath * addArcPath =[UIBezierPath bezierPath];
    [addArcPath moveToPoint:CGPointMake(170, 300)];
    [addArcPath addLineToPoint:CGPointMake(300, 300)];
    [addArcPath addArcWithCenter:CGPointMake(235, 350) radius:40 startAngle:0 endAngle:M_PI clockwise:YES];
    [addArcPath stroke];
  • addQuadCurveToPoint:controlPoint:

1.在路徑中增加一條二次貝塞爾曲線


4096267-1d9c88405ab009f7.jpeg
WechatIMG418.jpeg
UIBezierPath *bezierpath1 = [UIBezierPath bezierPath];
    [bezierpath1 moveToPoint:CGPointMake(200, 500)];
    // 引數一: 曲線的終點位置
    // 引數二: 控制點
    [bezierpath1 addQuadCurveToPoint:CGPointMake(300, 500) controlPoint:CGPointMake(210, 400)];
    
    [bezierpath1 stroke];
  • addCurveToPoint:controlPoint1:controlPoint2:

在路徑中增加一條三次貝塞爾曲線


4096267-b9bebb418cb809c3.jpeg
WechatIMG413.jpeg
UIBezierPath *bezierpath2 = [UIBezierPath bezierPath];
    [bezierpath2 moveToPoint:CGPointMake(50, 640)];
    // 引數一: 曲線的終點位置
    // 引數二: 控制點1
    //引數三:控制點2
    
    //[bezierpath1 addQuadCurveToPoint:CGPointMake(300, 500) controlPoint:CGPointMake(210, 400)];
    [bezierpath2 addCurveToPoint:CGPointMake(450, 640) controlPoint1:CGPointMake(120, 410) controlPoint2:CGPointMake(300, 530)];
    [bezierpath2 stroke];
  • closePath

closePath方法不僅結束一個shape的subpath表述,它也在最後一個點和第一個點之間畫一條線段,如果我們畫多邊形的話,這個一個便利的方法我們不需要去畫最後一條線。

  • removeAllPoints

移除這個UIBezierPath物件路徑中所有的點

  • appendPath:

在路徑中增加一個已有UIBezierPath路徑

  • CGPath

Core Graphics 的路徑表示

  • currentPoint

圖形路徑中的當前點。

  • 訪問圖形屬性

  • lineWidth

線寬定義接收器的被觸控路徑的厚度。0的寬度被解釋為可以在特定裝置上呈現的最薄的行。實際繪製的線寬可能與指定的寬度相差多達2個裝置畫素,這取決於線相對於畫素網格和當前反鋸齒設定的位置。行的寬度也可能受到活動圖形上下文當前轉換矩陣中指定的縮放因子的影響,預設的值為1

  • lineCapStyle

路徑的終點形狀, 該屬性適用於開放路徑的起點和終點, 預設為kCGLineCapButt(方形結束, 結束位置正好為精確位置), 其他可選項為kCGLineCapRound(圓形結束, 結束位置超過精確位置半個線寬)和kCGLineCapSquare(方形結束, 結束位置超過精確位置半個線寬)

  • lineJoinStyle

路徑的連線點形狀, 預設為kCGLineJoinMiter(全部連線), 其他可選項為kCGLineJoinRound(圓形連線)和kCGLineJoinBevel(斜角連線)

  • flatness

平坦度值測量真實曲線上的點和繪製曲線上的點之間最大的允許距離(以畫素為單位)。較小的值會導致更平滑的曲線,但需要更多的計算時間。較大的值會導致更多的鋸齒曲線,但渲染速度更快。預設平面度值為0.6。
在大多數情況下,不應改變平面度值。不過,您可能暫時增加平面度值,以最小化臨時繪製形狀所需的時間(例如在滾動過程中)

  • 繪製路徑

  • fill

利用當前繪畫屬性填充路徑封閉範圍, 該方法在繪畫之前會自動將開放子路徑封閉, 填充部分不包含路徑本身, 所以對於線寬較大的路徑, 填充部分會跟部分路徑重合

  • fillWithBlendMode:alpha:

利用指定模式填充路徑封閉範圍, 該方法在繪畫之前會自動將開放子路徑封閉, 填充部分不包含路徑本身, 所以對於線寬較大的路徑, 填充部分會跟部分路徑重合

  • stroke

利用當前繪畫屬性沿著路徑畫線

  • strokeWithBlendMode:alpha:

利用指定模式沿著路徑畫線

  • 裁剪路徑

  • addClip

沒怎麼用過

  • Hit Detection

  • containsPoint:

返回一個布林值,包含的區域是否包含指定的點

  • empty

是否路徑資訊為空, 即使通過moveToPoint:移動到指定的位置也算不為空

  • bounds

可以封閉所有路徑點的最小矩形範圍, 包括多次貝塞爾曲線的控制點在內