亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift操作Quartz 2D進行簡單的繪圖與坐標變換的教程

2020-03-09 17:48:49
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Swift操作Quartz 2D進行簡單的繪圖與坐標變換的教程,Quartz 2D是Core Graphics框架中的一個重要組件,經常被Mac OS或和iOS開發者用來繪圖,需要的朋友可以參考下
 

Quartz 2D簡介
Quartz 2D是蘋果公司開發的一個二維圖形繪制引擎,同時支持iOS和Mac系統。

它是一套基于C的API框架,提供了低級別、輕量級、高保真度的2D渲染。它能完成的工作有:

  • 繪制圖形 : 線條/三角形/矩形/圓/弧等
  • 繪制文字
  • 繪制/生成圖片(圖像)
  • 讀取/生成PDF
  • 截圖/裁剪圖片
  • 自定義UI控件

Quartz 2D進行繪圖
iOS繪圖技術主要有UIKit,Quartz 2D,Core Animation和OpenGL ES。我們平常對UIKit應該不陌生,而Quartz 2D與UIKit的一個區別是:
Quartz 2D的坐標原點在左下角,而UIKit的坐標原點在左上角。
在開始前作下準備工作:創建一個新的Cocoa Touch Class,繼承自UIView,然后去StoryBoard把view視圖關聯下新創建的類。

1.填充和描邊
重寫繪圖方法drawRect(),添加代碼:

復制代碼代碼如下:

 override func drawRect(rect: CGRect) {
     //填充背景
     UIColor.brownColor().setFill()
     //填充矩形
     UIRectFill(rect)
     UIColor.whiteColor().setStroke()
     //矩形描邊
     let frame = CGRectMake(10, 24, 100, 300)
     UIRectFrame(frame)
}

運行效果:

 

Swift,Quartz 2D

 

2.繪制三角形
確定三個點就能繪制出三角形,當然其他的圖形(如矩形)也是類似。
在drawRect()里添加代碼:

復制代碼代碼如下:

override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()
    //繪制起始點
    CGContextMoveToPoint(context, 120, 104)
    //從起始點到這一點
    CGContextAddLineToPoint(context, 150, 204)
    CGContextAddLineToPoint(context, 200, 104)
    //閉合路徑
    CGContextClosePath(context)
    UIColor.blackColor().setStroke()
    UIColor.greenColor().setFill()
    //繪制路徑
    CGContextDrawPath(context, CGPathDrawingMode.FillStroke)
}

運行效果:

 

Swift,Quartz 2D

依此類推,大家可以試試怎么去畫長方形,正方形和不規則多邊形。

3.繪制圖片和文字
首先準備一張圖片放入工程中,注意不要放在Assets.xcassets文件夾下,因為這里尋找的路徑是在工程文件夾。而如果把圖片放在Assets.xcassets文件夾下,就要使用另外的一種方法。
在drawRect()里添加代碼:

復制代碼代碼如下:

override func drawRect(rect: CGRect) {
    //繪制圖片和文字
    //這種方式添加圖片需要把圖片放到根目錄下,而不是Assets.xcassets下
    let imagePath = NSBundle.mainBundle().pathForResource("頭像004", ofType: "jpg")
    let image = UIImage(contentsOfFile: imagePath!)
    //具體位置根據你的圖片來調整
    image?.drawInRect(CGRectMake(100,100, 200, 200))
    let src="/uploads/allimg/160425/1A64G546-2.jpg?2016318141042" style="border: 1px solid rgb(204, 204, 204); border-image-source: none; vertical-align: bottom; padding: 1px; overflow: hidden; max-width: 650px;" />

 


Quartz 2D中的坐標變換
注意:坐標變換操作必須要在添加圖形之前,如果設置在添加圖形之后的話會無效。

我們先畫一個正方形做完參考:

復制代碼代碼如下:

override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()
    CGContextSetLineWidth(context, 2.0)
    CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor)
    let rectangle = CGRectMake(125, 50, 50, 50)
    CGContextAddRect(context, rectangle)
    CGContextStrokePath(context)
}

 

Swift,Quartz 2D

 

1、平移
func CGContextTranslateCTM(c: CGContext?, _ tx: CGFloat, _ ty: CGFloat)
該方法相當于把原來位于 (0, 0) 位置的坐標原點平移到 (tx, ty) 點。在平移后的坐標系統上繪制圖形時,所有坐標點的 X 坐標都相當于增加了 tx,所有點的 Y 坐標都相當于增加了 ty。

復制代碼代碼如下:

override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()
    CGContextSetLineWidth(context, 2.0)
    CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor)
    CGContextTranslateCTM(context, -50, 25) // 向左向下平移
    let rectangle = CGRectMake(125, 50, 50, 50) 
    CGContextAddRect(context, rectangle)
    CGContextStrokePath(context)
}

 

Swift,Quartz 2D

 

2、縮放
func CGContextScaleCTM(c: CGContext?, _ sx: CGFloat, _ sy: CGFloat)
該方法控制坐標系統在水平方向和垂直方向上進行縮放。在縮放后的坐標系統上繪制圖形時,所有點的 X 坐標都相當于乘以 sx 因子,所有點的 Y 坐標都相當于乘以 sy 因子。

復制代碼代碼如下:

override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()
    CGContextSetLineWidth(context, 2.0)
    CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor)    
    CGContextScaleCTM(context, 0.5, 1)
    let rectangle = CGRectMake(125, 50, 50, 50)
    CGContextAddRect(context, rectangle)
    CGContextStrokePath(context)
}

 

Swift,Quartz 2D

 

3、旋轉
func CGContextRotateCTM(c: CGContext?, _ angle: CGFloat)
該方法控制坐標系統旋轉 angle 弧度。在縮放后的坐標系統上繪制圖形時,所有坐標點的 X、Y 坐標都相當于旋轉了 angle弧度之后的坐標。

復制代碼代碼如下:

override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()
    CGContextSetLineWidth(context, 2.0)
    CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor)
    CGContextRotateCTM(context, CGFloat(M_PI_4))
    let rectangle = CGRectMake(125, 50, 50, 50)
    CGContextAddRect(context, rectangle)
    CGContextStrokePath(context)
}

 

Swift,Quartz 2D

注意:旋轉的時候,是整個 layer 都旋轉了,所以 layer 看起來應該是這樣的:

Swift,Quartz 2D

這個時候若想移動 view ,就應該按照這個旋轉過的坐標系來移動:

復制代碼代碼如下:

override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()
    CGContextSetLineWidth(context, 2.0)
    CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor)
    CGContextRotateCTM(context, CGFloat(M_PI_4))
    CGContextTranslateCTM(context, 0, -100) // 在新坐標系中向上移動100點,視圖上看起來像是向右向上都移動了
    let rectangle = CGRectMake(125, 50, 50, 50)
    CGContextAddRect(context, rectangle)
    CGContextStrokePath(context)
}

 

Swift,Quartz 2D



注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久久久国产| 亚洲国产成人久久综合一区| 国产欧美久久一区二区| 久久久久久国产免费| 欧美一级大片在线免费观看| 日韩精品中文在线观看| 91高清免费视频| 欧美日韩国产中文精品字幕自在自线| 九九九久久国产免费| 夜夜嗨av色综合久久久综合网| 亚洲免费影视第一页| 一个人看的www欧美| 国产主播精品在线| 18久久久久久| 欧美日韩美女在线| 亚洲少妇中文在线| 久久久国产精彩视频美女艺术照福利| 亚洲影影院av| 久久精品一区中文字幕| 亚洲国产欧美一区二区丝袜黑人| 久久久久五月天| 91天堂在线视频| 欧美激情一区二区三区久久久| 欧美国产日韩免费| 久久天堂电影网| 欧美午夜视频一区二区| 欧美高清一级大片| 91精品久久久久久久久久入口| 欧美电影在线观看高清| 日韩一区二区av| 国产成人精彩在线视频九色| 在线日韩第一页| 91亚洲精品久久久久久久久久久久| 91久久精品国产91久久| 一区二区三区视频观看| 91久久久亚洲精品| 亚洲自拍高清视频网站| 国产精品视频公开费视频| 亚洲欧美国产制服动漫| 国产精品夜色7777狼人| 日韩一区二区三区xxxx| 欧美性猛交xxxx免费看久久久| 日本乱人伦a精品| 欧美刺激性大交免费视频| 国产欧美久久久久久| 亚洲最大av网| 亚洲区免费影片| 另类视频在线观看| 中文欧美在线视频| 欧美日韩国产成人| 色天天综合狠狠色| 国产精品女人网站| 欧美高清自拍一区| 欧美激情二区三区| 91欧美激情另类亚洲| 国产精品美女免费视频| 日本精品性网站在线观看| 7777kkkk成人观看| 欧美日韩久久久久| 亚洲缚视频在线观看| 中文字幕在线国产精品| 日韩国产欧美精品在线| 亚洲最大成人在线| 亚洲aⅴ男人的天堂在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲激情在线观看视频免费| 欧美性极品xxxx做受| 日本一本a高清免费不卡| 久久九九亚洲综合| 久久久国产成人精品| 国产成人激情视频| 国产精品久久国产精品99gif| 亚洲国产精品免费| 国外视频精品毛片| 亚洲人成在线一二| 欧美成人剧情片在线观看| 久久久久这里只有精品| 国内精品久久久久久影视8| 久久久久久久av| 色琪琪综合男人的天堂aⅴ视频| 欧美乱妇高清无乱码| 亚洲视频一区二区| 欧美大片欧美激情性色a∨久久| 91av在线播放| 日韩精品免费看| 国产精品一区二区三区在线播放| 亚洲精品99久久久久中文字幕| 国内精品久久久久影院 日本资源| 欧美激情精品在线| 欧美刺激性大交免费视频| 51精品国产黑色丝袜高跟鞋| 中文字幕在线看视频国产欧美| www.欧美精品| 亚洲日本成人网| 色综合影院在线| 亚洲国产欧美日韩精品| 欧美精品18videosex性欧美| 国产精品久久久久国产a级| 欧美性猛交xxxx偷拍洗澡| 国产精品日韩在线| 九九热在线精品视频| 亚洲va欧美va国产综合久久| 亚洲欧美另类中文字幕| 日本道色综合久久影院| 成人av资源在线播放| 色偷偷偷综合中文字幕;dd| 亚洲欧洲偷拍精品| 成人a在线视频| 亚洲国产另类久久精品| 国外成人免费在线播放| 九九热视频这里只有精品| 亚洲伊人成综合成人网| 色一区av在线| 国产亚洲成av人片在线观看桃| 日韩欧美精品中文字幕| 成人免费淫片视频软件| 精品国产一区二区三区久久| 97视频人免费观看| 国产成人一区二区三区电影| www.国产精品一二区| 日韩在线免费视频观看| 国产中文日韩欧美| 91精品视频观看| 91精品视频在线免费观看| 91国产视频在线| 中文字幕欧美精品日韩中文字幕| 日韩电视剧在线观看免费网站| 欧美黄色性视频| 丝袜一区二区三区| 91精品国产91久久久久久久久| 日韩动漫免费观看电视剧高清| 亚洲日本aⅴ片在线观看香蕉| 在线日韩第一页| 国产成人亚洲综合青青| 日韩精品高清在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 久久久久久久久久久免费| 91av免费观看91av精品在线| 亚洲欧洲中文天堂| 日韩有码在线播放| 欧美一区在线直播| 亚洲天堂男人天堂女人天堂| 国产精品爽黄69| 久久国产精品首页| 亚洲aⅴ男人的天堂在线观看| 久久国产一区二区三区| 精品国产31久久久久久| 久久国产精品电影| 欧美日韩一区二区在线播放| 最近2019中文免费高清视频观看www99| 97在线观看免费| 久久精品一区中文字幕| 久久久久久久久久婷婷| 在线播放国产一区二区三区| 亚洲第一在线视频| 一本色道久久综合亚洲精品小说| 疯狂蹂躏欧美一区二区精品| 亚洲男女自偷自拍图片另类| 欧美精品成人91久久久久久久| 精品亚洲国产成av人片传媒| 草民午夜欧美限制a级福利片| 久久久久女教师免费一区| 日本一区二区在线免费播放| 不卡毛片在线看|