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 ...
随机推荐
- vs 设置自动缩进tab转换成空格
工具 选项 文本编辑器 如下图 选中插入空格 使用技巧: 按Ctrl+K+F组合键,可以自动进行代码对齐.
- leetcode python 030 Substring with Concatenation of All Words
## 您将获得一个字符串s,以及一个长度相同单词的列表.## 找到s中substring(s)的所有起始索引,它们只包含所有单词,## eg:s: "barfoothefoobarman&q ...
- 复制目录及其子目录下所有文件DOC
echo 开始同步代码 set src_home=F:\work\sign\Bonade-Sign set dest_home=F:\work\testGit\sign5\Bonade-Sign se ...
- 结构体变量的 extern 使用方法,转--
要求如下,在.h文件中这样定义: typedef struct typFNT_GB16 // 汉字字模数据结构 { signed ]; // 汉字内码索引 ]; ...
- 2019-04-16-day033-锁与队列
内容回顾 几个问题 概念多,练习少 不问问题 概念?代码? Process类 并发并行 并发 是同一时间段内多个任务交替使用同一个cpu 并行 是在同一个时刻多个任务在不同的cpu上同时执行 同步异步 ...
- java 几种对象
POJO(plain old java object):普通的java对象,有别于特殊的java对象(含继承约束等)和EJB.POJO一般只有一系列的属性和相应的get.set方法. PO( ...
- UnsupportedClassVersionError: org/apache/maven/plugin/compiler/CompilerMojo : Unsupported major.minor version 51.0
这篇博主说明了原因并给出了相应的解决方案!!! 博文连接如下: https://www.cnblogs.com/qiumingcheng/p/7151629.html
- L2-016. 愿天下有情人都是失散多年的兄妹(深搜)*
L2-016. 愿天下有情人都是失散多年的兄妹 参考博客 #include<iostream> #include<cstdio> #include<cstring> ...
- Apache Shiro 快速入门教程,shiro 基础教程
第一部分 什么是Apache Shiro 1.什么是 apache shiro : Apache Shiro是一个功能强大且易于使用的Java安全框架,提供了认证,授权,加密,和会话管理 ...
- 基于scrapy-redis分布式爬虫(简易)
redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...