绘制不同图形
import UIKit
class ViewController: UIViewController {
@IBAction func preserve(sender: UIButton) {
// let cv = self.view as! Drawline
// let array = cv.array
// //设置数据保存路径
// let path = NSHomeDirectory() + "/Documents/array.plist"
// print(path)
// //存储数据到本地,需实现NSCoding,归档
// NSKeyedArchiver.archiveRootObject(array, toFile: path)
//设置Drawline类对象
let cv = self.view as! Drawline
let array = cv.array
//设置图片保存路径
let path = NSHomeDirectory() + "/Documents/1.jpg"
print(path)
//
NSKeyedArchiver.archiveRootObject(array, toFile: path)
//1. 开始一个image上下文,绘制在内存的一个区域
UIGraphicsBeginImageContext(self.view.bounds.size)
//2. 获取image context
//a.
let context = UIGraphicsGetCurrentContext()
for line in array {
line.draw(context!)
}
CGContextDrawPath(context, .Stroke)
//b. 将视图上的所有内容绘制到当前的context中
//截屏
cv.drawViewHierarchyInRect(cv.bounds, afterScreenUpdates: true)
//3. 从当前上下文中获取图片(UIImage)
let image = UIGraphicsGetImageFromCurrentImageContext()
// let data = UIImagePNGRepresentation(image) //UIImage -> NSData
let data = UIImageJPEGRepresentation(image, 0.4)
try! data?.writeToFile(path, options: .AtomicWrite)
//4. 结束图形上下文
UIGraphicsEndImageContext()
}
//设置绘制图形类型
@IBAction func line(sender: AnyObject) {
let cv = self.view as! Drawline
cv.type = Line.self
}
@IBAction func rectangle(sender: AnyObject) {
let cv = self.view as! Drawline
cv.type = Rectangle.self
}
@IBAction func Ellipse(sender: AnyObject) {
let cv = self.view as! Drawline
cv.type = ellipse.self
}
//设置绘制图形的颜色
@IBAction func greencolor(sender: AnyObject) {
let cv = self.view as! Drawline
cv.color = UIColor.greenColor()
}
@IBAction func blackcolor(sender: AnyObject) {
let cv = self.view as! Drawline
cv.color = UIColor.blackColor()
}
override func viewDidLoad() {
super.viewDidLoad()
let cv = self.view as! Drawline
//将数据取出来,解档
let path = NSHomeDirectory() + "/Documents/array.plist"
let array = NSKeyedUnarchiver.unarchiveObjectWithFile(path)
if let a = array as? Array<Line> {
cv.array = a
}
}
}
绘制图形类
import UIKit
class Drawline: UIView {
var array = Array<Shape>()
var begin : CGPoint!
var end : CGPoint!
//设置Shape的类型
var type: Shape.Type = Line.self
var color : UIColor = UIColor.redColor()
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
let context = UIGraphicsGetCurrentContext()
// var index = 0
// //循环绘制图像(线,矩形,椭圆)
// while index < array.count{
// CGContextMoveToPoint(context, array[index].x, array[index].y)
// CGContextAddLineToPoint(context, array[index+1].x, array[index+1].y)
// CGContextAddRect(context, CGRect(x: array[index].x, y: array[index].y, width: array[index+1].x-array[index].x, height: array[index+1].y-array[index].y))
// CGContextAddEllipseInRect(context, CGRect(x: array[index].x, y: array[index].y, width: array[index+1].x-array[index].x, height: array[index+1].y-array[index].y))
//
// index += 2
// }
// //判断是否为空,起始点与终点
// if begin != nil && end != nil{
// CGContextMoveToPoint(context, begin.x, begin.y)
// CGContextAddLineToPoint(context, end.x, end.y)
// CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor)
// CGContextStrokePath(context)
// }
//循环绘制,(传进去的shape.color为保存的颜色)
for shape in array {
CGContextSetStrokeColorWithColor(context, shape.color.CGColor)
shape.draw(context!)
CGContextStrokePath(context)
}
}
func touchAndPoint(touches: Set<UITouch>)->CGPoint{
let touch = touches.first
let point = touch?.locationInView(self)
return point!
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
let point = touchAndPoint(touches)
// //1.存储起始位置的坐标
// begin = point
// //将坐标存到数组中
// array.append(point)
//2.创建当前图形的对象
let shape = type.init()
//存储起点
shape.begin = point
//保存当前将要绘制的图形的颜色
shape.color = color
array.append(shape)
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
let point = touchAndPoint(touches)
// end = point
// if array.count%2 == 1{
// array.append(point)
// }else{
// array[array.count-1] = point
// }
let shape = array.last
shape?.end = point
self.setNeedsDisplay()
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
let point = touchAndPoint(touches)
// end = point
// if array.count%2 == 1{
// array.append(point)
// }else{
// array[array.count-1] = point
// }
let shape = array.last
shape?.end = point
self.setNeedsDisplay()
}
}
图形类
import UIKit
class Shape: NSObject, NSCoding {//继承NSCoding
var begin: CGPoint!
var end: CGPoint!
//定义一个成员用来保存将要绘制图形的颜色
var color : UIColor = UIColor.redColor()
required override init() {
super.init()
}
required init?(coder aDecoder: NSCoder) {
begin = aDecoder.decodeCGPointForKey("begin")
end = aDecoder.decodeCGPointForKey("end")
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeCGPoint(begin, forKey: "begin")
aCoder.encodeCGPoint(end, forKey: "end")
}
func draw(context: CGContextRef) {
}
}
图形子类
import UIKit
class ellipse: Shape {
override func draw(context: CGContextRef) {
CGContextMoveToPoint(context, begin.x, begin.y)
CGContextAddEllipseInRect(context, CGRect(x: begin.x, y: begin.y, width: end.x - begin.x, height: end.y - begin.y))
}
}
import UIKit
class Line: Shape {
override func draw(context: CGContextRef) {
CGContextMoveToPoint(context, begin.x, begin.y)
CGContextAddLineToPoint(context, end.x, end.y)
}
}
import UIKit
class Rectangle: Shape {
override func draw(context: CGContextRef) {
CGContextAddRect(context, CGRect(x: begin.x, y: begin.y, width: end.x - begin.x, height: end.y - begin.y))
}
}