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,615评论 0 20
  • --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益...
    韩七夏阅读 2,812评论 2 10
  • 上周,miss闫说让我们周末做南瓜灯,我心中充满了好奇,南瓜灯?难道是南瓜上刻着鬼脸的,灯放在南瓜里的那个?...
    曹子恒阅读 366评论 0 0
  • 今天是写日记的第一天,不知该从何写起,该写什么内容。刚开始说写日记我是有点抵触心理的,因为我上学也不喜欢写日记,总...
    姜雪萍阅读 171评论 0 3
  • 昨天没写,对吧,总是会忘记或者不想写,既然已定,那就不要纠结了。就像我不在去想为什么活着,不在迷茫,心中有了...
    DreamWorld阅读 104评论 0 0