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 ...
随机推荐
- Json 网络传递解析异常
在项目中碰到一个bug,A项目请求B项目,获取到的Json无法解析,B项目封装的Json,在项目内部可以正常解析,问题并不是Json 解析的错误,而是实体Bean中有数组类型的字段;解决办法就是对封装 ...
- SQL配置的坑
我要被自己蠢哭了,新做了一台电脑装SQL sever为了存数据,配置完,突然间发现MSSQLSEVER 不能重新启动,相当于之前的配置,还IP都白弄了.我找原因找了3个小时,后来发现是手欠启动的不该启 ...
- datatables 行与列的数据获取
datatables官网: https://datatables.net/reference/api/cells() 获取数据的方式如下 var table = $(selector).DataTab ...
- BULK语句 将TXT数据塞入数据库表格
SET @iSQL=N'BULK INSERT [TEST].[dbo].[TEST_Interim]'+' FROM '+quotename(@fullFileName,'''')+' WITH ( ...
- 邮件远控电脑MCC-python实现
本次实现的是一个通过邮件来远程控制电脑,以达到某些远程操作,例如让电脑执行CMD命令,播放音乐,打开指定文件等操作的项目.代码参考了网上的部分教程. 具体流程: 在python代码中,通过一个循环来接 ...
- Ubuntu Desktop 编译 ffmpeg (简略的写写)
关于ffmpeg FFmpeg是一個自由軟體,可以執行音訊和視訊多種格式的錄影.轉檔.串流功能,包含了libavcodec——這是一個用於多個專案中音訊和視訊的解碼器函式庫,以及libavformat ...
- SpringMVC + MyBatis分库分表方案
mybatis作为流行的ORM框架,项目实际使用过程中可能会遇到分库分表的场景.mybatis在分表,甚至是同主机下的分库都可以说是完美支持的,只需要将表名或者库名作为动态参数组装sql就能够完成.但 ...
- 535种使用JavaScript重新加载页面的方法
除了location = location之外还有534中方法重新加载页面 location = location location = location.href location = window ...
- Windows10下安装MySQL8.0
1:首先去官网下载安装包 下载地址:https://dev.mysql.com/downloads/mysql/ 这是我下载版本 2:将解压文件解压到你安装的目录:E:\mysql-8.0.11-wi ...
- CSS权值
选择器权值 标签选择器:权值为1 类选择器和伪类:权值为10 ID选择器:权值为100 通配符选择器:权值为0 行内样式:权值为1000 !important规则: 可调整样式规则的优先级 添加在样式 ...