1.繪圖板
制作繪圖板中遇到的思路卡殼的點
- 畫多個形狀的圖如何定義類
- 有的形狀需要多個點
- 繪制不同顏色的圖形時遇到的思路短路
- 保存數據的問題
解決:
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()//結束圖形上下文