酱油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<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))
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容