Note 21 2D绘图

2D绘图

四层框架:

上层的可以用下层的,越下层功能越多,并且越简单

  1. Cocoa touch Layer
  2. Media Layer
  3. Core Service Layer 服务层
  4. Core OS layer 核心系统层

Core Animation

一.设置圆形的按键

CALayer 显示

        let btn = UIButton(type: .System)
        btn.frame = CGRect(x: 100, y: 100, width: 50, height: 50)
        self.view.addSubview(btn)
        btn.backgroundColor = UIColor.cyanColor()
        btn.layer.cornerRadius = 25//倒圆角,倒脚半径25
        
        btn.layer.borderColor = UIColor.blueColor().CGColor
        btn.layer.borderWidth = 1 //设置边框大小才会生效(默认边框长度为0)
        
        btn.layer.shadowColor = UIColor.blackColor().CGColor
        btn.layer.shadowOffset = CGSize(width: 1, height: 1)
        btn.layer.shadowOpacity = 0.7 //设置透明度 默认是0

二.UIView绘图

绘制的三种方法:

  1. CGContextStrokePath(context)
  2. CGContextFillPath(context)
  3. CGContextDrawPath(context, mode: CGPathDrawingMode)

CGPathDrawingMode:

 public enum CGPathDrawingMode : Int32 {
    
    case Fill
    case EOFill
    case Stroke
    case FillStroke    非零环绕数
    case EOFillStroke  奇偶环绕数EO even-odd

}
//填充和绘制边框模式 

绘图前获取当前绘图环境(上下文)
let context = UIGraphicsGetCurrentContext()
绘图环境设置了,就一直会有效,可以用SaveGstate与RestoreGstate去保存与恢复

1.绘制线

绘图过程:
** MoveToPoint - AddlineToPoint - StrokePath **

        CGContextMoveToPoint(cxt, 0, 0)
        CGContextAddLineToPoint(cxt, 50, 50)
        CGContextAddLineToPoint(cxt, 0, 100)
        let cgp = CGPoint(x: 50, y: 0)
        CGContextAddLineToPoint(cxt,cgp.x, cgp.y)
        //设置了当前绘图环境的任何画图工具的东西,都一直会有效
        UIColor.cyanColor().setStroke()//设置线的颜色
        CGContextSetLineWidth(cxt, 5)//设置线的宽度
        CGContextSetLineCap(cxt, .Round)//设置线两段的头
        CGContextSetLineJoin(cxt, .Round)//设置连接处
        CGContextStrokePath(cxt)
        
        CGContextMoveToPoint(cxt, 90, 0)
        CGContextAddLineToPoint(cxt, 100, 100)
        CGContextSetLineDash(cxt, 0, [2,3], 2) //设置虚线, 1.偏移量, 2.虚线重复的像素, 3.数组里面的个数
        CGContextStrokePath(cxt)
        
        CGContextMoveToPoint(cxt, 50, 60)
        CGContextAddLineToPoint(cxt, 50,100)
        CGContextStrokePath(cxt)

2.绘制矩形

        //设置填充颜色
        UIColor.redColor().setFill()
        
        //绘制矩形
        CGContextAddRect(context, CGRect(x: 0, y: 0, width: 150, height: 50))
        CGContextDrawPath(context, .FillStroke)
        //填充方式-非零环绕数,奇偶环绕数(Even-odd)
        //CGContextStrokePath(context) 只绘制边框
        //CGContextFillPath(context) 只填充

3.绘制圆弧

        //绘制弧线
        //1.
        CGContextAddArc(context, 150, 150, 50, 0, CGFloat(M_PI/3), 0)
        
        //2.
        CGContextMoveToPoint(context, 150,200)
        CGContextAddArcToPoint(context, 200, 200, 300, 400, 150)
        
        CGContextStrokePath(context)//绘图

4.贝兹曲线(贝赛尔曲线)

        //贝兹曲线(贝赛尔曲线)
        let context = UIGraphicsGetCurrentContext()
        //二次方的需要三个点
        CGContextMoveToPoint(context, 100, 100)//第一个点
        CGContextAddQuadCurveToPoint(context, 150, 0, 300, 100)//设置第二第三个点
        //三次方的需要四个点
        //二次方的终点是第一个点
        CGContextAddCurveToPoint(context, 350, 50, 380, 80, 400, 100)//设置第二个点,第三个点,地四个点
        CGContextStrokePath(context)

5.绘制网格,利于观察图形

        let context = UIGraphicsGetCurrentContext()
        
        //绘制网格
        var y: CGFloat = 50
        while y < self.bounds.size.height {
            //2. 开始,设置绘制起点
            CGContextMoveToPoint(context, 0, y)
            //3. 往上下文上添加图形
            CGContextAddLineToPoint(context, self.bounds.size.width, y)
            y += 50
        }
        
        var x: CGFloat = 50
        while x < self.bounds.size.width {
            //2. 开始,设置绘制起点
            CGContextMoveToPoint(context, x, 0)
            //3. 往上下文上添加图形
            CGContextAddLineToPoint(context, x, self.bounds.size.height)
            
            x += 50
        }
        CGContextSaveGState(context)//保存绘图状态
        
        UIColor.cyanColor().setStroke()
        CGContextSetLineDash(context, 0, [2,2], 2)
        CGContextStrokePath(context)
        
        CGContextRestoreGState(context)//恢复保存时候的绘图状态

//Graph plot chart pie bar

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

推荐阅读更多精彩内容