iOS --制作画板 --2

定义一个继承于NSObject的model对象,用于存储

线的颜色,路径及线宽

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>//一定导入UIKit框架
@interface PathModel : NSObject

@property(nonatomic,assign)CGMutablePathRef path;//路径(需要调用set方法retain)
@property(nonatomic,strong)UIColor *color;//颜色
@property(nonatomic,assign)CGFloat lineWidth;//线宽

@end

//记得要将路径计数值加一,复写set方法
#import "PathModel.h"

@implementation PathModel

-(void)dealloc
{
    CGPathRelease(_path);
}

- (void)setPath:(CGMutablePathRef)path
{
    //使路径的计数值加一,这样在DrawView中释放路径后,model中仍然存在,不会出现野指针
    CGPathRetain(path);
     _path = path;
}
@end

DrawView中的实现代码

#import "DrawView.h"
#import "PathModel.h"
@implementation DrawView

-(instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        //设置默认值
        _lineWidth = 1;
        _color = [UIColor blackColor];

    }
    return self;
}

- (void)drawRect:(CGRect)rect {

    //如果可变数组不是空的,则需要重新绘制之前的路径
    if (_pathArray.count>0)
    {
        for (int i = 0; i<_pathArray.count; i++)
        {
            //遍历数组中的所有元素 取出model中的属性并绘制之前的线条
            PathModel *model = _pathArray[i];
            CGContextRef context = UIGraphicsGetCurrentContext();
            CGMutablePathRef path = model.path;
            UIColor *color = model.color;
            CGFloat width = model.lineWidth;
            //绘制
            CGContextAddPath(context, path);
           //设置填充颜色
            [color set];
            //设置线宽
            CGContextSetLineWidth(context, width);

            //设置头尾及连接点的类型为圆的,
            CGContextSetLineJoin(context, kCGLineJoinRound);
            CGContextSetLineCap(context, kCGLineCapRound);
            CGContextDrawPath(context, kCGPathStroke);
        }
    }
    //当_LinePath不为空的时候,说明开始绘制新的线条,颜色和线宽就是在视图控制器中通过block块传递过来的参数
    if (_LinePath != nil)
    {
        CGContextRef context = UIGraphicsGetCurrentContext();
        
        [_color set];
        CGContextSetLineWidth(context, _lineWidth);
        
        CGContextAddPath(context, _LinePath);

        CGContextDrawPath(context, kCGPathStroke);
    }
    
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //取得手指开始触摸的点的坐标
    CGPoint p = [[touches anyObject] locationInView:self];
    //创建路径
    _LinePath  = CGPathCreateMutable();
    //获得路径开始的点的坐标
    CGPathMoveToPoint(_LinePath, NULL, p.x, p.y);
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
     //获得手指一动过程中经过的点的坐标
    CGPoint p = [[touches anyObject]locationInView:self];
    //将这些点添加到路径中
    CGPathAddLineToPoint(_LinePath, NULL, p.x,p.y);
    //重新绘制
    [self setNeedsDisplay];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    //创建一个可变数组,存放model对象,(model中有颜色,线宽,路径三个属性)
    if (_pathArray==nil)
    {
        _pathArray = [[NSMutableArray alloc]init];

    }
    //创建model对象,并且给model中的属性赋值
    PathModel *model = [[PathModel alloc]init];
    model.path = _LinePath;
    model.lineWidth = _lineWidth;
    model.color = _color;
    //将model存放到可变数组中
    [_pathArray addObject:model];
    //手指结束触摸时将路径释放掉
    CGPathRelease(_LinePath);
    _LinePath = nil;
    
}

- (void)undo
{
    if (_pathArray.count>0)
    {
        [_pathArray removeLastObject];
        [self setNeedsDisplay];
    }
}
- (void)clear
{
    if (_pathArray.count>0)
    {
        [_pathArray removeAllObjects];
        [self setNeedsDisplay];
    }
}

@end

效果图

时间: 2024-10-15 06:15:26

iOS --制作画板 --2的相关文章

iOS 制作view渐变的效果CAGradientLayer

有时候我们需要在view中加入渐变的效果来让它看起来有玻璃质感,可以使用Core Animation框架中提供的CAGradientLayer来实现. 代码如下:首先添加QuartzCore.framework然后加入如下代码: #import <QuartzCore/QuartzCore.h> - (CAGradientLayer *)shadowAsInverse { CAGradientLayer *newShadow = [[[CAGradientLayer alloc] init] 

iOS 制作一个简单的画板

制作简单画板 作为iOS初学者,在学习完UI的几个简单控件(UILable,UITextField,UIButton)之后,就可以制作一个简单的画图板demo,以下是具体制作流程(在MRC下),如有不足之处,还请各位大神们指教 0.0. 1.搭建界面,主要由UIButton,UITextField组成,底部的按钮是UITextField的一个自定义键盘(inputView) . - (void)viewDidLoad { [super viewDidLoad]; //创建菜单按钮 UIButto

制作画板.md

package com.kaige123.paint; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JFileChooser; import javax.swing.JFrame; impo

iOS: 为画板App增加 Undo/Redo(撤销/重做)操作

这个随笔的内容以上一个随笔为基础,(在iOS中实现一个简单的画板),上一个随笔实现了一个简单的画板: 今天我们要为这个画板增加Undo/Redo操作,当画错了一笔,可以撤销它,或者撤销之后后悔了,还可以还原.而且我们要通过晃动手机来触发Undo/Redo的选择. 这个demo使用NSUndoManager实现Undo/Redo操作,NSUndoManager 的实现原理是它作为一个记录器,每次数据变化,我们要用这个记录器记录一个相反的操作,当需要undo的时候,它通过执行这个相反的操作就可以实现

【转】IOS制作静态库

原文参见:http://blog.csdn.net/pjk1129/article/details/7255163 本身IOS的开发,只允许静态库或者Framework.在Xcode上没有找到允许编译,如同Android上的*.so和Win32上的dll这样的说法.不过Framework这样的框架,估计也是类似动态库的实现,不过没有具体研究过,后续继续深入研究. 我这个文档的静态库的开发是基于Xcode4.2和iOS SDK5.0编写的.Xcode4跟之前的Xcode3还是有不少的差别的. 下面

OpenCV +Python 制作画板

效果图 画图工具实现 代码 运行结果 程序分析 窗体自由度 如何退出程序 滚动条相关 支持的事件 首先声明一下,本例思路不是博主原创,博主在前人的代码上进行了个性化的修改,制作了一个简单的画图工具.下面附上自己的理解,与君共勉. 效果图 画图工具实现 代码 # coding:utf-8 import sys reload(sys) sys.setdefaultencoding('utf8') # __author__ = '郭 璞' # __date__ = '2016/9/14' # __De

iOS制作自己的Framework框架

1.新建工程选择iOS -> Cocoa Touch Framework 2.进入工程将工程自带的文件干掉 3.导入自己所需的文件 4.4.TARGETS -> Build Settings 中设置相关项(1).Build Active Architecture Only 设置为NO的意思是当前打包的.framework支持所有的设备.否则打包时只能用当前版本的模拟器或真机运行. 2).Build Setting 搜索linking 设置Dead Code Stripping 为NO是编译选项

iOS:制作一个简易的计算器

初步接触视图,制作了一个简易的计算器,基本上简单的计算是没有问题的,不是很完美,可能还有一些bug,再接再厉. 1 // 2 // ViewController.m 3 // 计算器 4 // 5 // Created by ma c on 15/8/25. 6 // Copyright (c) 2015年 bjsxt. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewContr

iOS-画板程序(手势操作无)

// // HMPaintView.h // 画板 // // Created by YaguangZhu on 15/9/10. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import <UIKit/UIKit.h> @interface HMPaintView : UIView @property(nonatomic,assign)CGFloat width; @property(nonatomic,strong