iOS利用drawRect画图
来源:互联网 发布:js给div加style 编辑:程序博客网 时间:2024/06/10 06:30
- (void)drawRect:(CGRect)rect
- //绘制控件的时候调用
//切记不要手动调用该方法 如果需要用到这个方法的话可以通过[self setNeedsDisplay];来让系统帮助调用drawRect
#import "YiView.h"@implementation YiView//初始化一个装线段的数组-(id)initWithFrame:(CGRect)frame{ if (self=[super initWithFrame:frame]) { _lineArray=[[NSMutableArray alloc]initWithCapacity:0]; } return self; } - (void)drawRect:(CGRect)rect{ //创建画布 CGContextRef context=UIGraphicsGetCurrentContext(); //遍历这个线段数组 [_lineArray enumerateObjectsUsingBlock:^(Yiline* _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { //设置画笔颜色,这里的obj.clo是在一个line类中声明的属性 CGContextSetStrokeColorWithColor(context, [obj.clo CGColor]); //设置画笔宽度,这里的obj.with也是在line中声明的属性 CGContextSetLineWidth(context, obj.with); //把数组中已经存在的线段找出来 obj.points是在ling类中声明的一个装点的数组 [obj.points enumerateObjectsUsingBlock:^(NSValue* _Nonnull value, NSUInteger idx, BOOL * _Nonnull stop) { //把所有的point点找出来 if (idx==0) { //起点 CGPoint point=[value CGPointValue]; CGContextMoveToPoint(context, point.x, point.y); }else{ CGPoint point=[value CGPointValue]; CGContextAddLineToPoint(context, point.x, point.y); } }]; CGContextStrokePath(context); }];}//这个是上面提到的line类//创建装点的数组@property(nonatomic,strong)NSMutableArray*points;//描述线段的颜色@property(nonatomic,strong)UIColor*clo;//描述线段的宽度@property(nonatomic,assign)float with;//在该类的.m中初始化装点的数组-(id)init{ if (self=[super init]) { if (self) { _points=[[NSMutableArray alloc]init]; } }return self;}//以上是画布的View及画线的类 下面进入到ViewController{ //画图的view YiView*_view; //自定义的线段类 Yiline*line; //UI控件 UISegmentedControl*seg; //装线段颜色的数组 NSArray*colors; //记录UISegmentedControl点击的哪个 NSInteger seleindex; //UI控件 UISlider*slider; //UI控件 UISwitch*swi;}- (void)viewDidLoad { [super viewDidLoad]; //创建画图的View _view=[[YiView alloc]initWithFrame:CGRectMake(0, 0, 375, 667)]; _view.backgroundColor=[UIColor whiteColor]; self.view=_view; //这是一个拖拽的手势 UIPanGestureRecognizer*gesture=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGeature:)]; [_view addGestureRecognizer:gesture]; //UISegmentedControl seg=[[UISegmentedControl alloc]initWithItems:@[@"红色",@"蓝色",@"绿色"]]; seg.selectedSegmentIndex=0; seg.frame=CGRectMake(20, 50, 320, 50); [seg addTarget:self action:@selector(segChange:) forControlEvents:UIControlEventValueChanged]; [self.view addSubview:seg]; //创建撤销按钮 UIButton*btn=[[UIButton alloc]initWithFrame:CGRectMake(20, 110, 90, 50)]; [btn setTitle:@"撤销" forState:UIControlStateNormal]; btn.backgroundColor=[UIColor grayColor]; [btn addTarget:self action:@selector(cheXiaoBtn) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn]; //创建保存相册按钮 UIButton*savebtn=[[UIButton alloc]initWithFrame:CGRectMake(120, 110, 90, 50)]; [savebtn setTitle:@"保存相册" forState:UIControlStateNormal]; savebtn.backgroundColor=[UIColor grayColor]; [savebtn addTarget:self action:@selector(saveBtn) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:savebtn]; //创建还原按钮 UIButton*returenBtn=[UIButton buttonWithType:UIButtonTypeCustom]; returenBtn.frame=CGRectMake(220, 110, 90, 50); [returenBtn setTitle:@"还原" forState:UIControlStateNormal]; returenBtn.backgroundColor=[UIColor grayColor]; [returenBtn addTarget:self action:@selector(returnBtn) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:returenBtn]; //创建UISlider slider=[[UISlider alloc]initWithFrame:CGRectMake(20, 160, 320, 50)]; slider.maximumValue=20; slider.minimumValue=1; slider.maximumTrackTintColor=[UIColor redColor]; slider.minimumTrackTintColor=[UIColor blackColor]; [self.view addSubview:slider]; //创建switch swi=[[UISwitch alloc]initWithFrame:CGRectMake(310, 110, 65, 50)]; swi.onTintColor=[UIColor blueColor]; swi.tintColor=[UIColor greenColor]; [self.view addSubview:swi]; //初始化线段颜色的数组 colors=[[NSArray alloc]initWithObjects:[UIColor redColor],[UIColor blueColor],[UIColor greenColor], nil]; 初始化还原的数组 _returnArray=[[NSMutableArray alloc]initWithCapacity:0]; } -(void)segChange:(UISegmentedControl*)seeg{//记录UISegmentedControl点击的哪个 seleindex=seeg.selectedSegmentIndex;} //拖拽手势绑定的方法-(void)panGeature:(UIPanGestureRecognizer*)gesture{ YiView*view1=(YiView*)gesture.view; if (gesture.state==UIGestureRecognizerStateBegan) { //创建线段对象 line=[[Yiline alloc]init]; if (swi.on==YES) { //模仿橡皮擦功能 line.clo=[UIColor whiteColor]; }else{ line.clo=[colors objectAtIndex:seleindex]; } line.with=slider.value; [view1.lineArray addObject:line]; } //获取当前手势所在view上所有的点 CGPoint point=[gesture locationInView:gesture.view]; [line.points addObject:[NSValue valueWithCGPoint:point]]; [_view setNeedsDisplay];}//保存相册按钮执行的方法-(void)saveBtn{ UIGraphicsBeginImageContext(self.view.bounds.size); [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage*viewImage=UIGraphicsGetImageFromCurrentImageContext(); UIImageWriteToSavedPhotosAlbum(viewImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);}- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{ if (!error) { NSLog(@"成功"); } else { NSLog(@"失败"); }}//撤销按钮执行的方法-(void)cheXiaoBtn{ //如果线段数组没有值直接返回 if (_view.lineArray.count<=0) { return; } //有值的话将最后一个元素加入还原数组中 [_returnArray addObject:[_view.lineArray lastObject]]; //再将最后一个元素移除 [_view.lineArray removeLastObject]; //调用drawRect方法 [_view setNeedsDisplay];}//还原按钮执行的方法-(void)returnBtn{ //如果还原数组中没有值直接返回 if (_returnArray.count<=0) { return; } //有值的话将还原数组中最后一个元素加入线段数组 [_view.lineArray addObject:[_returnArray lastObject]]; //再把其移除掉 [_returnArray removeLastObject]; 调用drawRect方法 [_view setNeedsDisplay];}
至此一个简单的利用drawRect画图的功能就实现了 下面是效果
如图就是一个简单的涂鸦效果可以撤销可以还原可以更换笔的颜色可以保存到相册(http://img.blog.csdn.net/20160322213803040)
0 0
- iOS利用drawRect画图
- ios drawrect 画图,截图
- ios-使用CGContextRef重写drawrect画图
- iOS重绘机制drawRect 附:画图画线等code
- ios drawRect
- iOS 利用贝塞尔曲线画图
- 通过CAShapeLayer 和 DrawRect 来画图形
- ios drawRect绘制图形
- ios drawRect绘制图形
- iOS drawRect绘画
- iOS DrawRect简单使用
- iOS之DrawRect
- IOS drawRect 重绘
- iOS 内存恶鬼drawRect
- ios-drawrect方法解析
- iOS重绘机制drawRect
- iOS快速更新drawRect方法
- iOS重绘机制drawRect
- json-c有时我们会忽略的问题
- RHCE7 搭建SAMBA服务实现目录网络共享
- linux-kernel-4.1 USB-批量传输 赏析
- Google 网上论坛(Google Online Forums)
- 安装了Visual Studio 2008自带的SQL Server 2005后,设置sa登录名
- iOS利用drawRect画图
- 杭电1260 Tickets 动态规划
- VS2010上编译opencv3.1.0的32位静态链接库(动态链接库)
- 数据结构 串匹配 好难懂
- GWAS with plink
- 51 nod 1103 N的倍数(鸽巢原理)
- 第5课 基础知识
- PAT (Advanced Level) Practise 1071 Speech Patterns (25)
- 【POJ3624】Charm Bracelet(01背包)