• 简易涂鸦板


    delegate.h

    @property (retain, nonatomic) UIWindow *window;

    delegate.m

    -(void)dealloc{

        [_window release];

        [super dealloc];

    }

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]autorelease];

        // Override point for customization after application launch.

        self.window.backgroundColor = [UIColor whiteColor];

        [self.window makeKeyAndVisible];

        MainViewController *mainVC = [[[MainViewController alloc]init]autorelease];

        self.window.rootViewController = mainVC;

        return YES;

    }

    创建LineMode类

    LineMode.h

    @interface LineModel : NSObject

    @property(nonatomic,retain)UIBezierPath *path; //使用贝塞尔曲线记录触摸轨迹

    @property(nonatomic,retain)UIColor *color ; //线条颜色

    @property(nonatomic,assign)CGFloat width; //线条宽度

    @end

    LineMode.m

    -(void)dealloc{

        [_path release];

        [_color release];

        [super dealloc];

    }

     创建属于UIView的PaintView

    PaintView.h

    @property(nonatomic,retain)NSMutableArray *allLines; //用于保存画板上所有线条对象.

    @property(nonatomic,retain)UIColor *lineColor; //当前线条的颜色

    @property(nonatomic,assign)CGFloat lineWidth; //当前线条的宽度

    -(void)undoLastDrawing; //撤销上次绘制

    -(void)allClean; //清空画板

     PaintView.m

    #import "PaintView.h"

    #import "LineModel.h"

    @implementation PaintView

     -(void)dealloc{

        [_allLines release];

        [_lineColor release];

        [super dealloc];

    }

    -(NSMutableArray *)allLines{

        if (!_allLines) {

            self.allLines = [NSMutableArray array];

        }

        return _allLines;

    }

     -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

        UITouch *aTouch = touches.anyObject;

        CGPoint startPoint = [aTouch locationInView:self.superview];

            //创建贝塞尔曲线对象,并设置曲线的起始点.

        UIBezierPath*bezierPath=[UIBezierPath bezierPath];

        [bezierPath moveToPoint:startPoint];

        //  创建线条模型对象 并保存线条的三个数据

        LineModel*line=[[[LineModel alloc]init]autorelease];

        line.path=bezierPath;

        line.color=self.lineColor;

        line.width=self.lineWidth;

        

        [self.allLines addObject:line];

        

    }

     -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

        UITouch *aTouch = touches.anyObject;

        CGPoint currentPoint =[aTouch locationInView:self.superview];

        //获取对应的线条模型(在触摸移动的过程中,数组的最后一个对象对应当前正在绘制的曲线)

        LineModel *aLine = self.allLines.lastObject;

        [aLine.path addLineToPoint:currentPoint];

        [self setNeedsDisplay]; //调用此方法是通知视图,绘制界面,一旦调用此方法,系统就会自动调用drawRect:方法来绘制界面.

    }

    // Only override drawRect: if you perform custom drawing.

    // An empty implementation adversely affects performance during animation.

    - (void)drawRect:(CGRect)rect {

    //     Drawing code

        for (LineModel *aLine in self.allLines) {

            //设置填充颜色

            [aLine.color setStroke];

            //设置绘制时的线条宽度

            [aLine.path setLineWidth:aLine.width];

            [aLine.path stroke]; //开始绘制曲线

        }

    }

    -(void)undoLastDrawing{

        [self.allLines removeLastObject];

        [self setNeedsDisplay]; //移除数组中的最后一条曲线对象,并重绘界面.

    }

    -(void)allClean{

        [self.allLines removeAllObjects];

        [self setNeedsDisplay];

    }

    @end

    创建的MainViewController

    MainViewController.m

    -(void)loadView{

        PaintView *painView = [[PaintView alloc]initWithFrame:[[UIScreen mainScreen]bounds]];

        painView.backgroundColor = [UIColor whiteColor];

        painView.lineWidth = 5;

        painView.lineColor = [UIColor blackColor];

        self.view = painView;

        [painView release];

    }

    - (void)viewDidLoad {

        [super viewDidLoad];

        // Do any additional setup after loading the view.

        //创建菜单按钮

        UIButton *menuButton = [UIButton buttonWithType:UIButtonTypeSystem];

        menuButton.frame = CGRectMake(CGRectGetWidth(self.view.bounds)-80, 40, 60, 40);

        [menuButton setTitle:@"菜单" forState:UIControlStateNormal];

        [menuButton addTarget:self action:@selector(handleMenuButtonAction:) forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:menuButton];

        

        UITextField *textField = [[UITextField alloc]initWithFrame:CGRectZero];

        textField.tag = 123;

        [self.view addSubview:textField];

        [textField release];

        UIView *inputView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), 60)];

        inputView.backgroundColor = [UIColor whiteColor];

        textField.inputView = inputView;

        [inputView release];

        

        NSArray *titles = @[@"减小",@"增大",@"撤销",@"清空",@"颜色"];

        CGFloat width = (CGRectGetWidth(self.view.bounds)-20*6)/5;

        CGFloat height = width;

        CGFloat originY = (60 - height) / 2;

        CGFloat originX = 20;

        for (int i = 0; i<titles.count; i++) {

            UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];

            button.tag = 100+i;

            button.frame = CGRectMake(originX+(width+originX)*i, originY, width, height);

            [button setTitle:titles[i] forState:UIControlStateNormal];

            button.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:0.6];

            [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

            //设置按钮的角半径,为按钮宽度的一半

            button.layer.cornerRadius = width / 2.0;

            button.layer.masksToBounds = YES; //按指定的半径裁剪视图.

            [button addTarget:self action:@selector(handleButtonAction:) forControlEvents:UIControlEventTouchUpInside];

            [inputView addSubview:button];

        }

        

    }

    -(void)handleMenuButtonAction:(UIButton *)sender{

        //获取textField

        UITextField *textField = (UITextField *)[self.view viewWithTag:123];

        //判断如果textField当前是第一响应者,则撤销其第一响应者权限,否则让其成为第一响应者.

        if (textField.isFirstResponder) {

            [textField resignFirstResponder];

        }else{

            [textField becomeFirstResponder];//成为第一响应者

        }

    }

    -(void)handleButtonAction:(UIButton *)sender{

        PaintView *paintView = (PaintView *)self.view; //获取画板视图

        switch (sender.tag) {

            case 100:

                if (paintView.lineWidth > 2) {

                    paintView.lineWidth -=1;

                }

                break;

            case 101:

                paintView.lineWidth +=1;

                break;

            case 102:

                [paintView undoLastDrawing];

                break;

            case 103:

                [paintView allClean];

                break;

            case 104:

                sender.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];

                //设置画笔颜色

                paintView.lineColor = sender.backgroundColor;

                break;

                

            default:

                break;

        }

    }

  • 相关阅读:
    关于编码问题
    期中架构之前所有的命令-总结
    Bootstrap表格添加搜索栏
    Bootstrap表格分页(二)
    Bootstrap表格分页(一)
    Entity Framework 分页处理
    Protocol Buffers v3.0.0编译安装小记
    golang学习笔记
    Java 对象生命周期
    Java 操作符
  • 原文地址:https://www.cnblogs.com/lz824129/p/4891755.html
Copyright © 2020-2023  润新知