一. 简单做一个画板

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的更多相关文章

  1. CATransition(os开发之画面切换) 的简单用法

    CATransition 的简单用法 //引进CATransition 时要添加包“QuartzCore.framework”,然后引进“#import <QuartzCore/QuartzCo ...

  2. jquery.validate.js 表单验证简单用法

    引入jquery.validate.js插件以及Jquery,在最后加上这个插件的方法名来引用.$('form').validate(); <!DOCTYPE html PUBLIC " ...

  3. NSCharacterSet 简单用法

    NSCharacterSet 简单用法 NSCharacterSet其实是许多字符或者数字或者符号的组合,在网络处理的时候会用到 NSMutableCharacterSet *base = [NSMu ...

  4. [转]Valgrind简单用法

    [转]Valgrind简单用法 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html Valgrind的主要作者Julian S ...

  5. Oracle的substr函数简单用法

    substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串 subst ...

  6. Ext.Net学习笔记19:Ext.Net FormPanel 简单用法

    Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...

  7. TransactionScope简单用法

    记录TransactionScope简单用法,示例如下: void Test() { using (TransactionScope scope = new TransactionScope()) { ...

  8. WPF之Treeview控件简单用法

    TreeView:表示显示在树结构中分层数据具有项目可展开和折叠的控件 TreeView 的内容是可以包含丰富内容的 TreeViewItem 控件,如 Button 和 Image 控件.TreeV ...

  9. listActivity和ExpandableListActivity的简单用法

    http://www.cnblogs.com/limingblogs/archive/2011/10/09/2204866.html 今天自己简单的总结了listActivity和Expandable ...

随机推荐

  1. Yii2开启enableprettyurl(url美化)无效

    最终显示的url格式为:http://localhost/yii2/frontend/web/site/about 在/config/main.php中 'components'=>[] 中添加 ...

  2. 关于Java中的继承和组合的一个错误使用的例子

    [TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...

  3. PHP之:序列化和反序列化-serialize()和unserialize()

    撰写日期:2016-7-7 10:56:40 参考PHP在线手册(php.net):http://php.net/manual/zh/function.serialize.php 1.序列化 seri ...

  4. excel批处理_判断一个名称是不是药品

    把药品名称导入到sheet1的A字段 # -*- coding: utf-8 -*-"""Created on Fri Dec  9 09:38:58 2016判断一个名 ...

  5. 机器学习——Logistic回归

    1.基于Logistic回归和Sigmoid函数的分类 2.基于最优化方法的最佳回归系数确定 2.1 梯度上升法 参考:机器学习--梯度下降算法 2.2 训练算法:使用梯度上升找到最佳参数 Logis ...

  6. centos7安装svn1.8.16

    svn下载地址:http://subversion.apache.org/download/ svn要依赖一些包,可以提前装好 yum -y install apr-util apr-util-dev ...

  7. 360浏览器遇到文档模式是IE7的解决办法

    这段时间遇到了360浏览器在加载java项目时,默认的文档模式是IE7,使得网页加载下拉框出现问题. 解决的方法是: 在显示的jsp页面加上 <meta http-equiv="X-U ...

  8. acm小知识

    __builtin_popcount(i); __builtin_popcountll(i) ;//计算i的二进制表示中1的个数 int a[M] , b[M] ; memcpy(a+i , b+j ...

  9. 简单的C语言文法

    <程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→< ...

  10. Debian8升级4.5内核

    本文讲述如何升级Debian8的内核到4.5版本 0x01:去linux kernel官网https://www.kernel.org/下载4.5的内核,选择tar.xz格式 0x02:想办法把下载好 ...