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 ...
随机推荐
- substr()函数
substr 定义于头文件 <string> string substr (size_t pos = 0, size_t len = npos) const;复制子字符串,要求从指定位置开 ...
- 【总结】浅谈JavaScript中的接口
一.什么是接口 接口是面向对象JavaScript程序员的工具箱中最有用的工具之一.在设计模式中提出的可重用的面向对象设计的原则之一就是“针对接口编程而不是实现编程”,即我们所说的面向接口编程,这个概 ...
- bzoj 2141: 排队
2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MB Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我, ...
- canvas-渐变文字
html要求: <body onload="draw('canvas');"> body这里的onload一定要写,在这个处理模式下,是在body这里执行加载页面完成后 ...
- mybatis-generator运行命令
java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml -overwrite
- Java使用Fork/Join框架来并行执行任务
现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多. 虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并未这 ...
- nginx本地转发
在conf文件下找到nginx.conf配置文件:添加如下代码:
- 2016 年 11 月 12 个轻量级的 JavaScript 库
https://www.oschina.net/news/79316/2016-11-javascript-library?from=20161127
- 2.5多重else嵌套的二次方程求根
#include<stdio.h> #include<math.h> int main() { double a, b, c, disc, x1, x2, realpart, ...
- ruby 基础知识(一)
突然今天发现一大神的博客:http://www.cnblogs.com/jackluo/archive/2013/01/22/2871655.html 相信初学者会受益颇多 ruby 参考文档 ...