QuartZ2D __ 简单用法 1
一. 简单做一个画板
1. 建立一个UIView类
2. 在.m里建立一个延展
3. 分别定义一个起点, 一个终点的结构体属性 . 在建立一个存储路径的数组
@interface DrawView ()
{
CGPoint _startPoint;
CGPoint _endPoint;
} @property (nonatomic, strong) NSMutableArray *pathArray; @end
4. 懒加载数组
- (NSMutableArray *)pathArray
{
if (_pathArray == nil) {
_pathArray = [NSMutableArray array];
}
return _pathArray;
}
5. 开始绘制
(1) 起点
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 获取起点
_startPoint = [[touches anyObject] locationInView:self]; // 创建贝瑟尔路径
UIBezierPath *path = [UIBezierPath bezierPath];
// 起点
[path moveToPoint:_startPoint]; // 添加到数组中
[self.pathArray addObject:path]; }
(2) 终点
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
_endPoint = [[touches anyObject] locationInView:self]; // 终点
UIBezierPath *path = [self.pathArray lastObject]; [path addLineToPoint:_endPoint]; [self setNeedsDisplay];
}
6. 重写 - (void)drawRect:(CGRect)rect 方法
- (void)drawRect:(CGRect)rect {
// Drawing code
for (UIBezierPath *path in self.pathArray) {
// 设置颜色
[[UIColor orangeColor] set];
// 设置粗度
path.lineWidth = ;
// 渲染
[path stroke];
}
}
二. 绘制饼状图
注 : 为了好看, 我随即分成了大小颜色都不同的99份
代码实现
#import "DrawView.h" #define kcolor arc4random()% 256 / 255.0 @implementation DrawView // Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code NSMutableArray *array = [NSMutableArray array];
int sum = ;
for (int i = ; i< ; i ++) {
int num = arc4random()% ;
sum += num;
NSNumber *number = [NSNumber numberWithInt:num];
[array addObject:number];
}
// 记录起点和终点
CGFloat start = ;
CGFloat end = ;
// 遍历数据
for (NSNumber *num in array) { end = num.floatValue / sum * M_PI * ; UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(, ) radius: startAngle:start endAngle:start + end clockwise:YES];
// 关闭路径
[path addLineToPoint:CGPointMake(, )]; [[UIColor colorWithRed:kcolor green:kcolor blue:kcolor alpha:] set];
[path closePath];
[path fill];
start += end; }
@end
三. 截图用法
1. 首先要有一个imageView, 所以在ViewContorller先建立一个UIImageView的属性 将背景的图片设置出来
2. 建立一个继承自UIView的类
3. 在这个UIView类.m里实现截图 (.h中写了一个block块用于传递路径)
.h 代码实现
// 传递路径
typedef void(^block)(UIBezierPath *p); @interface MyView : UIView @property (nonatomic, copy) block myblock; @end
.m 代码实现
#import "MyView.h" @interface MyView () // 保存路径
@property (nonatomic, strong) NSMutableArray *pathArray; @end @implementation MyView - (NSMutableArray *)pathArray
{
if (! _pathArray) {
_pathArray = [NSMutableArray array];
}
return _pathArray;
} - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 1. 获取起始点 并且创建路径
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:[[touches anyObject] locationInView:self]]; // 2. 装入数组
[self.pathArray addObject:path]; } - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 1. 获取终点 (不止一个)
UIBezierPath *path = [self.pathArray lastObject];
[path addLineToPoint:[[touches anyObject] locationInView:self]]; // 2. 调用drawrect
[self setNeedsDisplay]; } - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 封闭路径
UIBezierPath *path = [self.pathArray lastObject];
[path closePath]; [self setNeedsDisplay];
// 调用block路径
self.myblock(path);
} // Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
for (UIBezierPath *path in self.pathArray) {
path.lineWidth = ;
[[UIColor orangeColor] set];
[path stroke]; }
} @end
4. 在ViewController中中回调路径
#import "ViewController.h"
#import "MyImageView.h"
#import "MyView.h"
@interface ViewController ()
@property (nonatomic, strong) UIImageView *imageView;
@property (nonatomic, strong) MyView *myView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 获取图片
// __block全局区
__block UIImage *image = [UIImage imageNamed:@""];
self.imageView = [[UIImageView alloc] initWithImage:image];
_imageView.frame = CGRectMake(, , image.size.width, image.size.height);
[self.view addSubview: _imageView];
self.myView = [[MyView alloc] initWithFrame:self.imageView.frame];
_myView.backgroundColor = [UIColor colorWithRed: green: blue: alpha:];
[self.view addSubview:_myView];
// 剪切
__weak typeof(self) weakSelf = self;
_myView.myblock = ^(UIBezierPath *p){
// 获取上下文
UIGraphicsBeginImageContextWithOptions(image.size, NO, );
// 路径
UIBezierPath *path = p;
// 剪切
[path addClip];
// 绘制
[image drawAtPoint:CGPointZero];
// 获取剪切后的图片
image = UIGraphicsGetImageFromCurrentImageContext();
// 结束上下文
UIGraphicsEndImageContext();
// 给imageView赋值
weakSelf.imageView.image = image;
};
}
@end
QuartZ2D __ 简单用法 1的更多相关文章
- CATransition(os开发之画面切换) 的简单用法
CATransition 的简单用法 //引进CATransition 时要添加包“QuartzCore.framework”,然后引进“#import <QuartzCore/QuartzCo ...
- jquery.validate.js 表单验证简单用法
引入jquery.validate.js插件以及Jquery,在最后加上这个插件的方法名来引用.$('form').validate(); <!DOCTYPE html PUBLIC " ...
- NSCharacterSet 简单用法
NSCharacterSet 简单用法 NSCharacterSet其实是许多字符或者数字或者符号的组合,在网络处理的时候会用到 NSMutableCharacterSet *base = [NSMu ...
- [转]Valgrind简单用法
[转]Valgrind简单用法 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html Valgrind的主要作者Julian S ...
- Oracle的substr函数简单用法
substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H' *从字符串第一个字符开始截取长度为1的字符串 subst ...
- Ext.Net学习笔记19:Ext.Net FormPanel 简单用法
Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...
- TransactionScope简单用法
记录TransactionScope简单用法,示例如下: void Test() { using (TransactionScope scope = new TransactionScope()) { ...
- WPF之Treeview控件简单用法
TreeView:表示显示在树结构中分层数据具有项目可展开和折叠的控件 TreeView 的内容是可以包含丰富内容的 TreeViewItem 控件,如 Button 和 Image 控件.TreeV ...
- listActivity和ExpandableListActivity的简单用法
http://www.cnblogs.com/limingblogs/archive/2011/10/09/2204866.html 今天自己简单的总结了listActivity和Expandable ...
随机推荐
- writing
1.作文类型和结构2.作文的四个评分标准3.作文的常用句型4.作文的逻辑观点 大作文分为几类:1.A类(Argument): 这类作文实际上是比较常见的,比如:Caring for children ...
- Ubuntu学习总结-10 XManager
最近接触到一个很有意思的实验,在这里与大家分享,实验目标在Window显示UBuntu程序. 1 测试环境: Windows8的IP地址 : 192.168.7.126 UBuntu16的IP地址 : ...
- Day10-线程进程
什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程是程序的一次 ...
- validate表单验证插件
1.引入validate.js包 <script src="xx/xx/jquery.validate.min.js"></script> 2.表单验证 / ...
- Servlet使用注解标注监听器(Listener)
Servlet3.0提供@WebListener注解将一个实现了特定监听器接口的类定义为监听器,这样我们在web应用中使用监听器时,也不再需要在web.xml文件中配置监听器的相关描述信息了. 下面我 ...
- 移动端 Web 开发前端知识整理
文章来源: http://www.restran.net/2015/05/14/mobile-web-front-end-collections/ 最近整理的移动端 Web 开发前端知识,不定期更新. ...
- Java学习笔记-按值传递
参数的值传递 实参必须与方法中次你故意的参数在次序和数量上匹配,在类型上兼容.类型兼容是指不需要经过显式的类型转换,实参的值就可以传递给形参.如将int型的实参值传递给double型形参. 当调用方法 ...
- 等价类划分方法的应用(jsp)
[问题描述] 在三个文本框中输入字符串,要求均为1到6个英文字符或数字,按submit提交. [划分等价类] 条件1: 字符合法; 条件2: 输入1长度合法; 条件3: 输入2长度合法: 条件4: 输 ...
- 使用Impersonation仿冒用户运行WCF 服务方法
默认情况下,当我们把wcf服务器部署在IIS上时, 我们访问wcf时使用的是IIS内建的内建角色,对于IIS8.0,它被命名为ApplicationPoolIdentity, 一般来说,系统为每个应用 ...
- web自动化工具-开篇
web自动化工具-开篇 最近几年,前端技术风一样的速度迭代更新,各种框架工具雨后春笋般涌现,作为一个平凡的开发者,也只能在洪流中沉沉浮浮,微不足道,以前前端叫做切图仔.美工,如今改了称号叫前端工程师, ...