一. 简单做一个画板

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. 【Beta】Scrum07

    Info 由于编译考试,会议记录推迟发布.18~19两天工作暂停:同时由于有组员外出不在学校,本次会议采用线上会议形式 时间:2016.12.17 21:35 时长:15min 地点:讨论组 类型:线 ...

  2. Neural Network Toolbox使用笔记1:数据拟合

    http://blog.csdn.net/ljp1919/article/details/42556261 Neural Network Toolbox为各种复杂的非线性系统的建模提供多种函数和应用程 ...

  3. Navicat Premium 的常用功能

    1.快捷键 1.1. F8 快速回到当前对象列表 1.2. Ctrl + q 打开查询界面 1.3. Ctrl + d 快速修改当前的表结构 1.4. Ctrl + r 运行当前查询界面里面的 sql ...

  4. nginx + SSL优化配置

    nginx + SSL优化配置: #http段添加如下配置项: http { ssl_prefer_server_ciphers on; #设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户 ...

  5. metaWeblog Test

     #include "stdio.h" int main(int argc ,char **argv) { printf("argc = %d \n",arg ...

  6. MATLAB读取一张RGB图片转成YUV格式

    1.读入照片 控制输出的标志定义 clc;close all;clear YES = 1; NO = 0; %YES表示输出该文件,请用户配置 yuv444_out_txt = 1; yuv444_o ...

  7. 【Redis安装学习】

    1.Redis 中文官网地址:http://www.redis.net.cn/download/ 这里只是简单的安装了下.具体的官网有详细的介绍和安装:跳转 如何安装 下载,解压,编译: $ wget ...

  8. Git on Windows 一些问题

    问题汇总 1. 卸载Git时,bin和usr目录删不掉 报错:bin, usr目前需要admin权限删除,或者这个目录被其他文件引用 打开taskmgr,找到所有引用 git/bin/ 下的文件的进程 ...

  9. Linux系统启动过程

    1. 从BIOS到KERNEL BIOS自检->MBR(GRUB)->KERNEL->KERNEL自解压->内核初始化->内核启动 BIOS自检 当电脑开机的时候,电脑会 ...

  10. 第3月第16天 fd_set 32 ACE_TP_Reactor

    1. #ifdef FD_SETSIZE #define __DARWIN_FD_SETSIZE FD_SETSIZE #else /* !FD_SETSIZE */ #define __DARWIN ...