Core Graphices 获取上下文
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 获取上下文的更多相关文章
- 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平台下, ...
- 前后台获取上下文context
1.web server端获取上下文:Context ctx = WafContext.getInstance().getContext();上下文中包含当前登录组织.当前登录用户.语种.数据库.客户 ...
- NET Core开发-获取所有注入(DI)服务
NET Core开发-获取所有注入(DI)服务 获取ASP.NET Core中所有注入(DI)服务,在ASP.NET Core中加入了Dependency Injection依赖注入. 我们在Cont ...
- Core Graphices 设置渐变
Core Graphices 设置渐变 Quartz 提供了两种设置渐变的方式 CGShadingRef and CGGradientRef 尝试CGGradientRef 的使用 import & ...
- 解决vue组件内前置路由守卫beforeRouteEnter无法获取上下文this
问题描述 vue框架,只有在报名页面报名成功,然后自动跳转到订单详情,才弹出一个引流弹窗,其他情况均不弹出,我就想到使用vue 的组件内前置守卫beforeRouteEnter来实现.beforeRo ...
- .NET Core 反射获取所有控制器及方法上特定标签
.NET Core 反射获取所有控制器及方法上特定标签 有个需求,就是在. NET Core中,我们想在项目 启动时,获取LinCmsAuthorizeAttribute这个特性标签所有出现的地方,把 ...
- Azure KeyVault(三)通过 Microsoft.Azure.KeyVault 类库在 .NET Core 上获取 Secrets
一,引言 上一篇文章,我们介绍了 Azure Key Vault 在实际项目中的用途,Azure Key Vault 作为密钥管理的服务,我们可以很轻松的利用它创建和控制用于加密的密钥,和管理证书和机 ...
- .Net Core 获取上下文HttpContext
1.先定义一个类 using Microsoft.AspNetCore.Http; namespace BCode.Util { public class MvcContext { public st ...
- EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下?
前言 这个问题从未遇见过,是一位前辈问我EF Core内存泄漏问题时我才去深入探讨这个问题,刚开始我比较惊讶,居然还有这种问题,然后就有了本文,直接拿前辈的示例代码并稍加修改成就了此文,希望对在自学E ...
随机推荐
- 查看apk文件包名的一些方法
1,如果有源码 直接将apk包修改为zip,并解压找到AndroidManifest.xml文件,在文件中搜索“package”找到相应的包名 2,使用adb命令 前提是已经下载android SDK ...
- LoadLibrary和GetModuleHandle
0x01 区别 LoadLibrary是把一个模块映射进调用进程的地址空间,需要时增加引用计数,每调用一次,引用计数增加一,需要通过相同步骤地调用FreeLibrary来减少引用次数,当为0时,系统 ...
- jmeter接口测试基础知识1.0
jmeter:性能测试工具,压测测试计划右键--添加--Threads(Users)--线程组(线程数就是并发数)--右键线程组--添加--Sampler--HTTP请求--最上面的名称可以修改,就是 ...
- Alpha冲刺10
前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10045588.html 作业博客:https://edu.cnblogs.com/campus ...
- Shell 变量替换及测试
声明:$ 后面跟linux可执行命令 一.变量替换 语法 说明 ${变量名#匹配规则} 从变量的开头进行规则匹配,将符合最 ...
- 根据ip获取地理信息
function getIPLoc_sina($queryIP){ $url = 'http://int.dpool.sina.com.cn/iplookup/iplookup.php?form ...
- wav文件格式分析与详解
WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形文件,可直接存储声音波形, ...
- HTML和CSS标签常用命名规则
1.Images 存放一些网站常用的图片: 2.Css 存放一些CSS文件: 3.Flash 存放一些Flash文件: 4.PSD 存放一些PSD源文件: 5.Temp 存放所有临时图片和其它文件: ...
- jQuery-2.DOM---jQuery遍历
jQuery遍历之children()方法 jQuery是一个合集对象,如果想快速查找合集里面的第一级子元素,此时可以用children()方法.这里需要注意:.children(selector) ...
- day07 深浅拷贝
今日概要 深浅拷贝(重点) 文件操作 详细内容 直接赋值: 直接将对象的引用赋值给另一个对象 v1=1000 v2=v1 #v1 v2指向同一个内存地址 print(id(v1),id(v2))#相等 ...