溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

UIKit框架(17)Quartz2D

發布時間:2020-07-18 20:48:46 來源:網絡 閱讀:318 作者:ymanmeng123 欄目:移動開發
  • Quartz2D介紹

什么是Quartz2D ?

     是一個二維繪圖引擎,同時支持iOS和Mac系統。

     

Quartz2D的價值?

     但是有些UI界面極其復雜,而且比較個性化,用普通的UI控件無法實現,這時可以利用Quartz2D技術將控件內部的結構畫出來,自定義控件的樣子。

     其實,iOS中大部分控件的內容都是由Quartz2D畫出來的 (有一些是通過WebKit渲染的)

     

開發方式?

     使用框架CoreGraphics

     Quartz2D是一套C語言API,但使用了面向對象的開發方式

    

圖像上下文對象:

     是最核心的對象,CGContextRef類型

     iOS中的很多C語言框架中,都有以Ref作為后綴的類型,這些類型都可以理解為對象

          如CFStringRef CFColorRef CFImageRef等


上下文的作用:

     保存繪圖信息、狀態;決定繪圖的輸出目標(視圖對象的圖層、p_w_picpath畫板、pdf等)

     UIKit框架(17)Quartz2D

   


  • UIView的繪制

繪制一個UIView,需要在子類中重寫drawRect:方法

- (void)drawRect:(CGRect)rect

     該方法中,會自動創建愛一個當前view對象圖層的上下文對象,通過以下函數獲取

CGContextRef UIGraphicsGetCurrentContext ( void );


UIView的刷幀:

     UIView子類的drawRect:方法調用的時機:

     1)對象第一次顯示時

     2)調用view對象的setNeedsDisplay或setNeedsDisplayInRect方法

     所以,通過setNeedsDisplay方法可以實現圖形的刷幀(重繪)操作。

 - (void)setNeedsDisplay


  • 圖片的繪制

圖片繪制的上下文需要用代碼創建:

void UIGraphicsBeginImageContext ( CGSize size );     //標識上下文的開始
void UIGraphicsEndImageContext ( void );       //標識上下文的結束

     size參數:圖片畫布的大小

     在這個方位內,通過UIGraphicsGetCurrentContext()函數可以獲得該上下文對象


獲得當前上下文中繪制的UIImage對象

UIImage * UIGraphicsGetImageFromCurrentImageContext ( void );


UIImage對象保存到照片的函數:

void UIImageWriteToSavedPhotosAlbum ( UIImage *p_w_picpath, id completionTarget, SELcompletionSelector, void *contextInfo );


  • 繪制的方式

繪制的步驟:

    1)獲得上下文對象

    2)進行繪制

    3)渲染


獲得上下文后,就可以在上下文上進行圖形的繪制,繪制的內容需要渲染到上下文

void CGContextStrokePath ( CGContextRef c );  //邊界方式渲染
void CGContextFillPath ( CGContextRef c );     //填充方式渲染


設置畫筆的顏色:

void CGContextSetRGBStrokeColor ( CGContextRef context, CGFloat red, CGFloatgreen, CGFloat blue, CGFloat alpha );
void CGContextSetRGBFillColor ( CGContextRef context, CGFloat red, CGFloatgreen, CGFloat blue, CGFloat alpha );

     也可以通過UIColor對象的set方式設置

- (void)set
- (void)setFill
- (void)setStroke


設置畫筆線寬:

void CGContextSetLineWidth ( CGContextRef c, CGFloat width );


設置畫筆起止點的樣式:

void CGContextSetLineCap ( CGContextRef c, CGLineCap cap );


設置畫筆轉折點的樣式:

void CGContextSetLineJoin ( CGContextRef c, CGLineJoin join );


畫筆狀態的保存/恢復(棧式)

void CGContextSaveGState ( CGContextRef c );
void CGContextRestoreGState ( CGContextRef c );



  • 繪制基本形狀

確定繪制位置:

void CGContextMoveToPoint ( CGContextRef c, CGFloat x, CGFloat y );


繪制線段:

void CGContextAddLineToPoint ( CGContextRef c, CGFloat x, CGFloat y ); //從當前位置繪制到指定位置
void CGContextAddLines ( CGContextRef c, const CGPoint points[], size_t count ); //多點繪制
void CGContextClosePath ( CGContextRef c ); //繪制封閉線段


繪制矩形:

void CGContextAddRect ( CGContextRef c, CGRect rect );


繪制橢圓:     

void CGContextAddEllipseInRect ( CGContextRef context, CGRect rect );


繪制圓?。?/p>

void CGContextAddArc ( CGContextRef c, CGFloat x, CGFloat y, CGFloat radius,CGFloat startAngle, CGFloat endAngle, int clockwise );


  • 路徑繪制

基于貝塞爾曲線的繪制(UIBezierPath)

+ (instancetype)bezierPath
- (void)moveToPoint:(CGPoint)point
- (void)addLineToPoint:(CGPoint)point
- (void)closePath
- (void)removeAllPoints
@property(nonatomic) CGFloat lineWidth
@property(nonatomic) CGLineCap lineCapStyle
@property(nonatomic) CGLineJoin lineJoinStyle
- (void)fill
- (void)stroke


基于CGPath的繪制

CGMutablePathRef CGPathCreateMutable ( void );
void CGPathMoveToPoint ( CGMutablePathRef path, const CGAffineTransform *m, CGFloat x, CGFloat y );
void CGPathAddLineToPoint ( CGMutablePathRef path, const CGAffineTransform *m, CGFloat x, CGFloat y );
void CGPathAddRect ( CGMutablePathRef path, const CGAffineTransform *m, CGRect rect );
void CGPathAddEllipseInRect ( CGMutablePathRef path, const CGAffineTransform *m, CGRect rect );
void CGPathAddArc ( CGMutablePathRef path, const CGAffineTransform *m, CGFloat x, CGFloat y, CGFloat radius,CGFloat startAngle, CGFloat endAngle, bool clockwise );
void CGPathRelease ( CGPathRef path );

     

  • 繪制文字

在上下文上繪制文字,需要使用NSString的方法:

- (void)drawInRect:(CGRect)rect
- (void)drawAtPoint:(CGPoint)point

     

  • 繪制圖片

- (void)drawInRect:(CGRect)rect
- (void)drawAtPoint:(CGPoint)point blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha
- (void)drawAtPoint:(CGPoint)point
- (void)drawAtPoint:(CGPoint)point blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha


  • 屏幕截圖

步驟:

a. 創建位圖上下文

b. 需要截圖的view,將其layer繪制到上下文

     view對象的layer屬性(即view的圖形)繪制到上下文的方法

- (void)renderInContext:(CGContextRef)ctx

c. 從位圖上下文獲得UIImage對象

d. 結束位圖上下文




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女