酱油07 - 程序封装与结构!(绘制不同图形)

绘制不同图形

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 {
            cv.array = a
        }
    }
}

绘制图形类

import UIKit

class Drawline: UIView {
    var array = Array()
    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)->CGPoint{
        let touch = touches.first
        let point = touch?.locationInView(self)
        return point!
    }
    override func touchesBegan(touches: Set, 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, 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, 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))
    }
}

你可能感兴趣的:(酱油07 - 程序封装与结构!(绘制不同图形))