Core Graphices 获取上下文的三种方式:

1、自定义view 重写view 的 drawRect:(CGRect)rect方法

- (void)drawRect:(CGRect)rect {

    /*
UIBezierPath *bezier = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 20, 80, 80) byRoundingCorners:UIRectCornerTopLeft| UIRectCornerTopRight cornerRadii:CGSizeMake(40, 0)]; [[UIColor magentaColor ]setFill];
[[UIColor redColor] setStroke]; //Path operations on the current graphics context当前图形上下文中执行路径操作 [p fill];//只操作了填充 把路径在上下文中执行
[p stroke];//只操作了画线 */
/******************上面是ui方式 下面是core graphices *****************************/
//当前上下文及画布为当前view
CGContextRef con = UIGraphicsGetCurrentContext(); CGContextAddEllipseInRect(con, CGRectMake(,,,)); CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor);
CGContextSetStrokeColorWithColor(con, [UIColor redColor].CGColor); // CGContextFillPath(con);//只操作了填充
// CGContextStrokePath(con);//只操作了画线
CGContextDrawPath(con, kCGPathFillStroke); }

draw的调用时机

1.如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。

2.该方法在调用sizeThatFits后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。

3.通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。

4.直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0.

注意:在UIView中绘制图形,获取的上下文就是这个view对应的layer的上下文。在渲染的时候,就是把图形渲染到对应的layer上。

  在执行渲染操作的时候,本质上它的内部相当于执行了 [self.layer drawInContext:ctx];

2、drawInContext:(CGContextRef)ctx

#import "GainContext_DrawInContext.h"

@implementation GainContext_DrawInContext

- (void)drawInContext:(CGContextRef)ctx{

//    UIGraphicsPushContext(ctx);
// UIBezierPath *bezier = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(10, 20, 80, 80) byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(40, 40)];
// [[UIColor magentaColor ]setFill];
// [[UIColor redColor] setStroke];
// [bezier fill];
// [bezier stroke];
// UIGraphicsPopContext(); /*************************************/ UIBezierPath *bezier = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(, , , ) byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(, )]; CGContextAddPath(ctx, bezier.CGPath);
CGContextSetStrokeColorWithColor(ctx, [UIColor magentaColor].CGColor);
CGContextSetFillColorWithColor(ctx, [UIColor cyanColor].CGColor); // CGContextStrokePath(ctx);
// CGContextFillPath(ctx); CGContextDrawPath(ctx, kCGPathEOFillStroke); }
调用: 

 GainContext_DrawInContext *layer = [GainContext_DrawInContext layer];
layer.frame = CGRectMake(, , , );
[layer setNeedsDisplay];
[self.view.layer addSublayer:layer];

注意:在自定义layer中的-(void)drawInContext:方法不会自己调用,只能自己通过setNeedDisplay方法调用

3、设置CALayer的delegate,然后让delegate实现drawLayer:inContext:方法,当CALayer需要绘图时,会调用delegate的drawLayer:inContext:方法进行绘图。

#import <UIKit/UIKit.h>

@interface GainContext_Delegate : NSObject

@end

#import "GainContext_Delegate.h"

@implementation GainContext_Delegate

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
// UIGraphicsPushContext(ctx);
// CGPoint center = CGPointMake(40, 40);
// UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:40 startAngle:0 endAngle:50*M_PI/180 clockwise:NO];
// [path addArcWithCenter:center radius:20 startAngle:50*M_PI/180 endAngle:0 clockwise:YES];
// [[UIColor magentaColor] setFill];
// [path fill];
// UIGraphicsPopContext(); CGPoint center = CGPointMake(, );
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius: startAngle: endAngle:*M_PI/ clockwise:NO];
[path addArcWithCenter:center radius: startAngle:*M_PI/ endAngle: clockwise:YES];
[[UIColor magentaColor] setFill]; CGContextAddPath(ctx, path.CGPath);
CGContextSetStrokeColorWithColor(ctx, [UIColor magentaColor].CGColor);
CGContextSetFillColorWithColor(ctx, [UIColor greenColor].CGColor);
CGContextDrawPath(ctx, kCGPathFillStroke); } /***调用***/

self.delegate = [[GainContext_Delegate alloc] init];


CAShapeLayer *delegateShapLayer = [CAShapeLayer layer];


delegateShapLayer.frame  = CGRectMake(10, 20, 100, 100);


delegateShapLayer.delegate = self.delegate;


[delegateShapLayer setNeedsDisplay];


[self.view.layer addSublayer:delegateShapLayer];


 

 4、画图片

          UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(, , , )];

         [self addSubview:imageView];

         UIGraphicsBeginImageContextWithOptions(CGSizeMake(, ), NO, [UIScreen mainScreen].scale);
CGContextRef contex = UIGraphicsGetCurrentContext(); UIBezierPath *bezier = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(, , , ) byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(, )]; CGContextAddPath(contex, bezier.CGPath);
CGContextSetStrokeColorWithColor(contex, [UIColor magentaColor].CGColor);
CGContextSetFillColorWithColor(contex, [UIColor cyanColor].CGColor); CGContextDrawPath(contex, kCGPathFillStroke);
UIFont *font = [UIFont systemFontOfSize:];
NSString *string = @"Core Graphics";
[string drawAtPoint:CGPointMake(, ) withAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:[UIColor redColor]}]; UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
imageView.image = im;

注意:coreGraphices 是不支持arc 的。。。

Core Graphices 获取上下文的更多相关文章

  1. Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor

    Webservice WCF WebApi   注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...

  2. 前后台获取上下文context

    1.web server端获取上下文:Context ctx = WafContext.getInstance().getContext();上下文中包含当前登录组织.当前登录用户.语种.数据库.客户 ...

  3. NET Core开发-获取所有注入(DI)服务

    NET Core开发-获取所有注入(DI)服务 获取ASP.NET Core中所有注入(DI)服务,在ASP.NET Core中加入了Dependency Injection依赖注入. 我们在Cont ...

  4. Core Graphices 设置渐变

    Core Graphices 设置渐变 Quartz 提供了两种设置渐变的方式  CGShadingRef and CGGradientRef 尝试CGGradientRef 的使用 import & ...

  5. 解决vue组件内前置路由守卫beforeRouteEnter无法获取上下文this

    问题描述 vue框架,只有在报名页面报名成功,然后自动跳转到订单详情,才弹出一个引流弹窗,其他情况均不弹出,我就想到使用vue 的组件内前置守卫beforeRouteEnter来实现.beforeRo ...

  6. .NET Core 反射获取所有控制器及方法上特定标签

    .NET Core 反射获取所有控制器及方法上特定标签 有个需求,就是在. NET Core中,我们想在项目 启动时,获取LinCmsAuthorizeAttribute这个特性标签所有出现的地方,把 ...

  7. Azure KeyVault(三)通过 Microsoft.Azure.KeyVault 类库在 .NET Core 上获取 Secrets

    一,引言 上一篇文章,我们介绍了 Azure Key Vault 在实际项目中的用途,Azure Key Vault 作为密钥管理的服务,我们可以很轻松的利用它创建和控制用于加密的密钥,和管理证书和机 ...

  8. .Net Core 获取上下文HttpContext

    1.先定义一个类 using Microsoft.AspNetCore.Http; namespace BCode.Util { public class MvcContext { public st ...

  9. EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下?

    前言 这个问题从未遇见过,是一位前辈问我EF Core内存泄漏问题时我才去深入探讨这个问题,刚开始我比较惊讶,居然还有这种问题,然后就有了本文,直接拿前辈的示例代码并稍加修改成就了此文,希望对在自学E ...

随机推荐

  1. 用python处理html代码的转义与还原

    用python处理html代码的转义与还原   转义 escape: import cgi s = cgi.escape("""& < >" ...

  2. 1-express学习

    1.在安装完node.js后,在Windows里面的cmd命令下,输入:express myapp --ejs 2.打开创建的工程myapp目录:cd myapp 3.安装:npm install 4 ...

  3. Dao层的sql语句

    2018-08-12     21:33:43 反思:在数据库执行的时候,sql语句是正确的,复制到方法中,执行出错   因为把限定条件改为?时,把左括号删掉了,sql语句报错 改正:一定要确保sql ...

  4. Python connect mariadb(Python连接mysql)

    #!/usr/bin/python#coding=utf-8 import MySQLdb # 打开数据库连接db = MySQLdb.connect("192.168.1.250" ...

  5. weinre 远程调试 安装 配置

    1.第一种方法:安装:npm install -g weinre 2.第一种方法:开启本地监听服务器(修改端口,默认端口是8080):在cmd中运行: weinre --httpPort 8101 - ...

  6. mysql group_concat(column) 函数替换成 oracle wm_concat(colum)

    11gr2和12C上已经摒弃了wm_concat函数,所以只能手动创建该函数 解决办法: 一.解锁sys用户 alter user sys account unlock; 二.创建包.包体和函数 以s ...

  7. Problem D: 平面上的点——Point类 (IV)

    Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定.现在我们封装一个“Point类”来实现平面上的点的操作. 根据“append.cc”,完成Point类的构造方 ...

  8. Verilog中的$display和$write任务

    $display(p1,p2, …,pn); $write(p1,p2, …,pn); 这两个函数和系统任务的作用都是用来输出信息,即将参数p2到pn按参数p1给定的格式输出.参数p1通常称为:“格式 ...

  9. L333 Should You Listen to Music While You Work?

    Should You Listen to Music While You Work? "Whistle while you work" is classic advice, str ...

  10. nodejs -- http模块. request() 方法 , get方法.

    1. request方法: 提交评论到慕课网: var http = require('http'); var querystring = require('querystring'); var po ...