一.首先,故事板实现界面的搭建: 搭建的效果图如下所示 :
下面的三种颜色的按钮是切换线条颜色的按钮.
实现的代码如下 :
1>设置线宽和颜色 :
#import "CustomPath.h" @implementation CustomPath + (id)paintPathWithLineWidth:(CGFloat)lineWidth color:(UIColor *)color { CustomPath *path = [[CustomPath alloc]init]; //设置线宽 path.lineWidth = lineWidth; //设置颜色 path.color = color; return path; } @end
2>子类化绘图 :
#import "PaintView.h" #import "CustomPath.h" @interface PaintView () @property (nonatomic,strong)CustomPath *path; @property (nonatomic,strong)NSMutableArray *pathArray; @end @implementation PaintView // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. //设置线宽的默认值 - (void)awakeFromNib { _lineWidth = 1; } //懒加载 - (NSMutableArray *)pathArray { if (_pathArray == nil) { _pathArray = [NSMutableArray array]; } return _pathArray; } //绘图 - (void)drawRect:(CGRect)rect { //从数组中取出即可以连续的画 for (CustomPath *path in _pathArray) { //设置绘制的颜色 [path.color setStroke]; //必须加上这句,不然不能绘制 [path stroke]; } } - (CGPoint)getPoint:(NSSet *)touches { UITouch *touch = [touches anyObject]; //取得开始位置 CGPoint point = [touch locationInView:self]; return point; } //触摸开始调用 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ /* UITouch *touch = [touches anyObject]; //取得开始位置 CGPoint startPoint = [touch locationInView:self]; */ CGPoint startPoint = [self getPoint:touches]; //自定义 (设置路径) _path = [CustomPath paintPathWithLineWidth:_lineWidth color:_color]; //将路径加入数组 [self.pathArray addObject:_path]; //设置起点 [_path moveToPoint:startPoint]; } //触摸移动调用 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ /* UITouch *touch = [touches anyObject]; //取得移动位置 CGPoint movePoint = [touch locationInView:self]; */ CGPoint movePoint = [self getPoint:touches]; //连线 [_path addLineToPoint:movePoint]; //设置移动后重新绘制 [self setNeedsDisplay]; } //清屏 - (void)clear { [_pathArray removeAllObjects]; //记得重新绘制 [self setNeedsDisplay]; } //撤销 - (void)undo { [_pathArray removeLastObject]; //记得重新绘制 [self setNeedsDisplay]; }
3>控制器ViewController代码 :
#import "ViewController.h" #import "PaintView.h" @interface ViewController () - (IBAction)clearScreen:(id)sender; - (IBAction)undo:(id)sender; - (IBAction)eraser:(id)sender; - (IBAction)sava:(id)sender; - (IBAction)lineWidthChange:(id)sender; - (IBAction)colorChange:(UIButton *)sender; @property (weak, nonatomic) IBOutlet PaintView *PaintView; @property (nonatomic,strong)UIBarButtonItem *lastItem; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } //封装切换按钮颜色方法 - (void)changeButtonColor:(UIBarButtonItem *)item { _lastItem.tintColor = nil; item.tintColor = [UIColor blackColor]; _lastItem = item; } //清屏 - (IBAction)clearScreen:(UIBarButtonItem *)sender { /* _lastItem.tintColor = nil; sender.tintColor = [UIColor blackColor]; _lastItem = sender; */ [self changeButtonColor:sender]; [_PaintView clear]; } //撤销 - (IBAction)undo:(UIBarButtonItem *)sender { /*_lastItem.tintColor = nil; sender.tintColor = [UIColor blackColor]; _lastItem = sender; */ [self changeButtonColor:sender]; [_PaintView undo]; } //橡皮擦 (将线条的颜色改为白色即可) - (IBAction)eraser:(UIBarButtonItem *)sender { /* _lastItem.tintColor = nil; sender.tintColor = [UIColor blackColor]; _lastItem = sender; */ [self changeButtonColor:sender]; _PaintView.color = [UIColor cyanColor]; } //保存图片至相册 - (IBAction)sava:(id)sender { //实现截屏->图片 //开启图片上下文 UIGraphicsBeginImageContext(self.view.frame.size); //取得当前图形上下文 CGContextRef ref = UIGraphicsGetCurrentContext(); //设置裁剪区域 CGContextClipToRect(ref, self.view.frame); //将视图的图层渲染到位图上下文 [self.view.layer renderInContext:ref]; //获取到当前图片 UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); //关闭图片上下文 UIGraphicsEndImageContext(); //将图片保存到相册 UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); } //将图片保存到相册后调用的方法 - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { NSLog(@"图片保存到相册成功..."); } //设置滑块控制线宽 - (IBAction)lineWidthChange:(UISlider *)sender { _PaintView.lineWidth = sender.value; } //改变颜色 - (IBAction)colorChange:(UIButton *)sender { _PaintView.color = sender.backgroundColor; } @end