Note 22 簡單繪圖板小總結

1.繪圖板

制作繪圖板中遇到的思路卡殼的點

  1. 畫多個形狀的圖如何定義類
  2. 有的形狀需要多個點
  3. 繪制不同顏色的圖形時遇到的思路短路
  4. 保存數據的問題

解決:

1.繪制的圖形有很多,例如直線,矩形,圓,橢圓,和線.

1.1因為不同形狀,大部分屬性相同,不同的屬性可以用重寫父類的方法來實現多態.

2.繼承共同的類,例如Shape,直線,矩形,圓等大部分都是由兩個點畫出來的,但是線是多個點連線.

2.1 所以在父類里,應該將多個點保存,然后再進行子類處理點,兩個點畫出來的,就保存前兩個點,但是繪圖過程中會保存多個點,但是最終圖形會取第一個點與最后一個點,所以這時候判斷,每次替換數組中的第二個點.線這種多個點的,取第一個點為起點,后面每次添加的點都連接起來(addlineToPoint)

兩個點---矩形,直線,圓等..

    override func addPoint(point: CGPoint) {
        let p = Point(point: point)
        
        if points.count < 2 {
            points.append(p)
        }
        else {
            points[1] = p
        }
    }

多個點---線

    override func addPoint(point: CGPoint) {
        let p = Point(point: point)
        
        points.append(p)
    }
        for p in points {
            CGContextAddLineToPoint(context, p.x, p.y)
      //這樣將全部點連接起來
        }

3.原本畫圖的代碼是,先將個形狀畫好,然后最后在用DrawPath繪制出來,是每次都是將全部線畫出來,而顏色等屬性設置了就一直有效.

        let context = UIGraphicsGetCurrentContext()
        for shape in array {
            shape.draw(context!)
        }
        CGContextDrawPath(context, .Stroke)

在這方法里面實現顏色的更改,太復雜了

因此我在shape父類里定義了一個UIColor類型的屬性,保存每個圖形的顏色,在每次繪制的時候,就更改顏色,所以要把DrawPath寫進循環里面,一個一個圖形繪制而不是將全部圖形畫好,然后再繪制出來

        let context = UIGraphicsGetCurrentContext()
        for shape in array {
            //多態
            shape.color!.setStroke()
            shape.draw(context!)
            CGContextDrawPath(context, .Stroke)
        }

這樣只需要修改兩處代碼就可以實現了

一開始思路就是在drawRect方法所在的類里面實現繪制出來圖形存在不同的顏色,后來想了下,發現思路不對,顏色應該屬于每個圖形的屬性,而不是繪制圖形的時候再去區分顏色,而且繪制圖的時候應該一個一個圖形分開區繪制,這樣每個圖也因為屬性不同而不同

同理,填充顏色,線寬等屬性也是可以這也設置的

4.1保存數據,用歸檔方式比較簡單,只要歸檔的對象的類實現了NSCoding就ok

4.2 或者用NSString里面的方法

NSStringFromCGPoint(point) 將CGPoint轉換成字符串

CGPointFromString取數據的時候將字符串轉換成CGPoint

2.保存圖片方式

        let vc = self.view as! customView
        let arr = vc.picArr as NSArray
        let path = NSHomeDirectory() + "/Documents/array.plist"
        NSKeyedArchiver.archiveRootObject(arr, toFile: path)
        //保存圖片
        UIGraphicsBeginImageContext(vc.bounds.size)//開始一個image上下文,繪制在內存一個區域
        
        //a.
//        let context = UIGraphicsGetCurrentContext()//獲取context,繪制需要保存的圖片
//        for i in vc.picArr {
//            i.draw(context!)
//        }
//        CGContextDrawPath(context, .Stroke)
//        
//        let picPath = NSHomeDirectory() + "/Documents/1.png"
//        let image = UIGraphicsGetImageFromCurrentImageContext()//從當前上下文獲取圖片
//        let data = UIImagePNGRepresentation(image)    //將圖片轉成NSData
//        data?.writeToFile(picPath, atomically: true) //保存
        
        //b.截屏方式
        vc.drawViewHierarchyInRect(vc.bounds, afterScreenUpdates: true)
        
        UIGraphicsEndImageContext()//結束圖形上下文
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Core Graphics Framework是一套基于C的API框架,使用了Quartz作為繪圖引擎。它提供了低...
    ShanJiJi閱讀 1,593評論 0 20
  • --繪圖與濾鏡全面解析 概述 在iOS中可以很容易的開發出絢麗的界面效果,一方面得益于成功系統的設計,另一方面得益...
    韓七夏閱讀 2,791評論 2 10
  • 上周,miss閆說讓我們周末做南瓜燈,我心中充滿了好奇,南瓜燈?難道是南瓜上刻著鬼臉的,燈放在南瓜里的那個?...
    曹子恒閱讀 342評論 0 0
  • 今天是寫日記的第一天,不知該從何寫起,該寫什么內容。剛開始說寫日記我是有點抵觸心理的,因為我上學也不喜歡寫日記,總...
    姜雪萍閱讀 170評論 0 3
  • 昨天沒寫,對吧,總是會忘記或者不想寫,既然已定,那就不要糾結了。就像我不在去想為什么活著,不在迷茫,心中有了...
    DreamWorld閱讀 101評論 0 0