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
原创粉丝点击