zoukankan      html  css  js  c++  java
  • 画板的实现

    一.首先,故事板实现界面的搭建: 搭建的效果图如下所示 :

    下面的三种颜色的按钮是切换线条颜色的按钮.

    实现的代码如下 :

    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
    

      

  • 相关阅读:
    HDU Problem 1811 Rank of Tetris【拓扑排序+并查集】
    POJ Problem 2367 Genealogical tree【拓扑排序】
    HDU Problem 2647 Reward【拓扑排序】
    HDU Problem 1285 确定比赛名次【拓扑排序】
    HDU Problem HDU Today 【最短路】
    HDU Problem 3665 Seaside【最短路】
    HDU Problem 一个人的旅行 【最短路dijkstra】
    HDU Problem 1596 find the safest road【最短路dijkstra】
    Beyond Compare文本合并进行内容替换要注意什么
    用这些工具都可以比较代码的差异
  • 原文地址:https://www.cnblogs.com/pengsi/p/4886369.html
Copyright © 2011-2022 走看看