IOS实现的简单画板功能

效果图

设计要求

1、画笔能设置大小、颜色

2、有清屏、撤销、橡皮擦、导入照片功能

3、能将绘好的画面保存到相册

实现思路

1、画笔的实现,我们可以通过监听用户的 平移手势 中创建 UIBezierPath 来实现线条的绘制

2、撤销功能,我们先来看下撤销功能,我们会想到用一个数组队列将用户的每一次的笔画都加入到数组中,然后撤销的时候只需要将最后添加进去的笔画pop掉,重新绘制就可以了

3、清屏功能就简单了,只需要将上面说到的那个数组清空重新绘制下就可以了

4、导入照片功能,可以用系统的 UIImagePickerController 选取照片得到UIImage,然后再将 UIImage 绘制到屏幕中就可以了

5、保存到相册功能,可以使用 UIGraphicsGetImageFromCurrentImageContext 获取当前的图片上下文,得到屏幕画面的 UIImage ,然后通过 UIImageWriteToSavedPhotosAlbum 写入到相册

具体代码实现

1、先画个界面

2、因为我们绘制线条会用到 UIBezierPath ,并且要能可设置颜色,但是UIBezierPath是没有设置颜色的属性,所以我们这里需要简单扩展一下,创建一个继承于 UIBezierPath 的子类 DrawPath

//
// DrawPath.h
// 画板
//
// Created by xgao on 16/4/13.
// Copyright © 2016年 xgao. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface DrawPath : UIBezierPath
// 画笔颜色
@property(nonatomic,retain)UIColor* pathColor;
@end

这个子类只需要扩展一个属性,就是 pathColor 用来保存画笔的颜色

//
// DrawPath.m
// 画板
//
// Created by xgao on 16/4/13.
// Copyright © 2016年 xgao. All rights reserved.
//
#import "DrawPath.h"
@implementation DrawPath
@end

DrawPath.m 里面不需要做其它功能

3、接到来我们对画板功能的实现封装一下,创建一个继承于UIView的 DrawView子类

//
// DrawView.h
// 画板
//
// Created by xgao on 16/4/13.
// Copyright © 2016年 xgao. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface DrawView : UIView

// 画线的宽度
@property(nonatomic,assign)CGFloat lineWidth;

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

// 加载背景图片
@property(nonatomic,strong)UIImage* image;

// 清屏
- (void)clear;

// 撤销
- (void)undo;

// 橡皮擦
- (void)eraser;

// 保存
- (void)save;
@end
//
// DrawView.m
// 画板
//
// Created by xgao on 16/4/13.
// Copyright © 2016年 xgao. All rights reserved.
//

#import "DrawView.h"
#import "DrawPath.h"

@interface DrawView()

@property(nonatomic,strong) DrawPath* path;

// 线的数组
@property(nonatomic,strong) NSMutableArray* paths;

@end

@implementation DrawView

- (void)awakeFromNib{

 [self setUp];
}

- (instancetype)initWithFrame:(CGRect)frame
{
 self = [super initWithFrame:frame];
 if (self) {
 [self setUp];
 }
 return self;
}

// 重绘UI
- (void)drawRect:(CGRect)rect {

 for (DrawPath* path in self.paths) {

 if ([path isKindOfClass:[UIImage class]]) {
  // 画图片
  UIImage* image = (UIImage*)path;
  [image drawInRect:rect];
 }else{
  // 画线

  // 设置画笔颜色
  [path.pathColor set];

  // 绘制
  [path stroke];
 }
 }
}

// 懒加载属性
- (NSMutableArray*)paths{

 if (_paths == nil) {
 _paths = [NSMutableArray array];
 }
 return _paths;
}

// 重写image属性
- (void)setImage:(UIImage *)image{

 _image = image;

 // 将图片加入到线条数组中
 [self.paths addObject:image];

 [self setNeedsDisplay];
}

#pragma mark - Init

// 初始化
- (void)setUp{

 // 添加平移手势
 UIPanGestureRecognizer* panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGes:)];
 [self addGestureRecognizer:panGes];

 // 默认值
 self.lineWidth = 1;
 self.pathColor = [UIColor blackColor];
}

#pragma mark - Event

// 平移事件
- (void)panGes:(UIPanGestureRecognizer*)ges{

 // 获取当前点
 CGPoint curPoint = [ges locationInView:self];

 if (ges.state == UIGestureRecognizerStateBegan) { // 开始移动

 // 创建贝塞尔曲线
 _path = [[DrawPath alloc]init];

 // 设置线条宽度
 _path.lineWidth = _lineWidth;

 // 线条默认颜色
 _path.pathColor = _pathColor;

 // 设置起始点
 [_path moveToPoint:curPoint];

 [self.paths addObject:_path];
 }

 // 连线
 [_path addLineToPoint:curPoint];

 // 重绘
 [self setNeedsDisplay];
}

#pragma mark - Method

// 清屏
- (void)clear{

 [self.paths removeAllObjects];

 [self setNeedsDisplay];
}

// 撤销
- (void)undo{

 [self.paths removeLastObject];

 [self setNeedsDisplay];
}

// 橡皮擦
- (void)eraser{

 self.pathColor = [UIColor whiteColor];

 [self setNeedsDisplay];
}

// 保存
- (void)save{

 // ---- 截图操作
 // 开启上下文
 UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0);

 // 获取当前上下文
 CGContextRef context = UIGraphicsGetCurrentContext();

 // 渲染图层到上下文
 [self.layer renderInContext:context];

 // 从上下文中获取图片
 UIImage* image = UIGraphicsGetImageFromCurrentImageContext();

 // 关闭上下文
 UIGraphicsEndImageContext();

 // ---- 保存图片
 UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);

}

// 图片保存方法,必需写这个方法体,不能会保存不了图片
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{

 // 提示
 UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"保存成功" message:nil delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
 [alert show];
}
@end

4、接下来就是如果使用这个画板类了,直接上代码吧

//
// ViewController.m
// 画板
//
// Created by xgao on 16/4/13.
// Copyright © 2016年 xgao. All rights reserved.
//

#import "ViewController.h"
#import "DrawView.h"

@interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>

// 画板
@property (weak, nonatomic) IBOutlet DrawView *drawView;

@end

@implementation ViewController

- (void)viewDidLoad {
 [super viewDidLoad];

}

#pragma mark - Event

// 线条宽度变化
- (IBAction)lineWidthChange:(UISlider*)sender {

 _drawView.lineWidth = sender.value;
}

// 线条颜色变化
- (IBAction)pathColorChange:(UIButton*)sender {

 _drawView.pathColor = sender.backgroundColor;
}

// 清屏
- (IBAction)clearAction:(id)sender {

 [_drawView clear];
}

// 撤销
- (IBAction)undoAction:(id)sender {

 [_drawView undo];
}

// 橡皮擦
- (IBAction)eraserAction:(id)sender {

 [_drawView eraser];
}

// 照片
- (IBAction)pickerPhotoAction:(id)sender {

 // 照片选择控制器
 UIImagePickerController* picVC = [[UIImagePickerController alloc]init];
 // 照片源
 picVC.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
 // 委托
 picVC.delegate = self;

 [self presentViewController:picVC animated:YES completion:nil];
}

// 保存
- (IBAction)saveAction:(id)sender {

 [_drawView save];
}

#pragma mark - UIImagePickerControllerDelegate

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullable NSDictionary<NSString *,id> *)editingInfo{

 // 设置图片
 _drawView.image = image;

 // 关闭窗口
 [self dismissViewControllerAnimated:YES completion:nil];
}
@end

到这里就差不多了,这个小功能实现的基本思路与具体代码我都已经放上来了,大家如果还有哪里不清楚的可以留言喔~~

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

(0)

相关推荐

  • 分享一个iOS下实现基本绘画板功能的简单方法

    代码部分 TouchView.h 复制代码 代码如下: #import <UIKit/UIKit.h>    @interface TouchView : UIView  {      NSMutableArray *points;      NSArray *points_all;      CGContextRef context;      UIColor *paint_clr;  }  @property (strong,nonatomic) NSMutableArray *point

  • iOS简单画板开发案例分享

    最近在学习Quartz2D,学习了一个简单画板的实现,现在把实现过程记录一下. 主要用到的点就是画线,截屏,绘制图片,选择图片,以及保存所有绘制的线. 首先在storyboard上布局好控件,设置约束等等,最后的效果是这样: 自定义画板DrawView,使用时可能是从xib中加载,也可能是手动创建,所以创建对象的方法需要实现两个: #import <UIKit/UIKit.h> @interface DrawView : UIView /** 线宽 */ @property (nonatomi

  • IOS实现的简单画板功能

    效果图 设计要求 1.画笔能设置大小.颜色 2.有清屏.撤销.橡皮擦.导入照片功能 3.能将绘好的画面保存到相册 实现思路 1.画笔的实现,我们可以通过监听用户的 平移手势 中创建 UIBezierPath 来实现线条的绘制 2.撤销功能,我们先来看下撤销功能,我们会想到用一个数组队列将用户的每一次的笔画都加入到数组中,然后撤销的时候只需要将最后添加进去的笔画pop掉,重新绘制就可以了 3.清屏功能就简单了,只需要将上面说到的那个数组清空重新绘制下就可以了 4.导入照片功能,可以用系统的 UII

  • Python基于opencv实现的简单画板功能示例

    本文实例讲述了Python基于opencv实现的简单画板功能.分享给大家供大家参考,具体如下: import cv2 import numpy as np drawing = False # true if mouse is pressed ix,iy = -1,-1 def nothing(x): pass # mouse callback function def draw_circle(event,x,y,flags,param): global ix,iy,drawing g = par

  • 基于opencv实现简单画板功能

    OpenCV提供了很多简单的语句,实现复杂的功能,根据颜色和鼠标交互的基础语句,我们可以建立一个简单的画板.尽管它简单,但是制作的框架步骤不能少. 如果您感兴趣,可以按照我的步骤写一下,或者直接复制总程序中的代码运行. 一.功能 明确画板功能,便于后续编写程序. 目标功能:可调节颜色,有画图区域,可以进行鼠标输入. 二.框架搭建 主要有两步: 第一步:建立颜色选区,可以用OpenCV的滑动条语句cv.createTrackbar设置.cv.createTrackbar一共拥有五个参数设置,它们是

  • 用Java实现简单画板功能

    现在,我们来讲一下怎么用Java来实现简单画板,要实现的功能有:选择图形(方形.圆形.多边形...).可以选择颜色. 首先,打开windows下的画图软件,我们知道我们需要一个窗体(JFrame):我们要画画,需要画板:我们要选择图形.颜色,所以还应用到按钮组件,说到这里,我们所需要的原料基本完成了.接下来,我们要考虑布局:我们采用最简单的布局,窗体的最上面放选择图形的按钮,中间是画板,最下面是选择颜色的按钮.就是这样的: 我们把图形按钮.颜色按钮安排在两个面板上,画板为一个单独的面板,对于布局

  • iOS tableview实现简单搜索功能

    本文实例为大家分享了tableview实现搜索功能的具体代码,供大家参考,具体内容如下 一.先用xcode创建好工程 通过xib文件来初始化视图控制器 二.编写代码 1.先为NSDictionary创建一个分类 实现字典的深拷贝 .h文件 #import <Foundation/Foundation.h> @interface NSDictionary (MutableDeepCopy) - (NSMutableDictionary *)mutableDeepCopy; @end .m文件 #

  • iOS开发实现简单计算器功能

    用Object-C写的一个简单的计算机程序,主要学习按钮的action动作. 下面是主界面: 下面代码时界面按钮和ViewController.h连接的地方: - (IBAction)button_0:(UIButton *)sender; - (IBAction)button_dian:(UIButton *)sender; - (IBAction)button_dengyu:(UIButton *)sender; - (IBAction)button_1:(UIButton *)sender

  • iOS实现简单计算器功能

    本文实例为大家分享了iOS实现简单计算器功能的具体代码,供大家参考,具体内容如下 //  ZYAppDelegate.m //  Calculator // //  Created by mac on 15-7-30. //  Copyright (c) 2015年 zhiyou. All rights reserved. //   #import "ZYAppDelegate.h"   @implementation ZYAppDelegate   - (BOOL)applicati

  • iOS如何开发简单的手绘应用实例详解

    开发一款简单的 iOS 手绘应用, 收集点,绘制形状,给形状着色,呈现给用户,好像就完了 框架是 Quartz2D 1, 收集点 首先需要有一个界面 UIView, 用这个界面监听用户的手势,收集点 用户按下手指 location(in, 从触摸事件中,获得在画板中的坐标 var lastPoint = CGPoint.zero override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { guard l

  • Android仿iOS侧滑退出当前界面功能

    我们都知道在ios手机上面,有一个侧滑退出当前界面的功能,但是在安卓手机上系统没有给我们提供这样的功能,但是这依然阻挡不了强大的安卓的定制功能,我们完全可以自己定制一套这样的功能. 首先看下效果图: 分析: (1)要想模仿ios的这种效果,因为我们通过手指的滑动,所以这里肯定跟我们的滑动事件有关系(onInterceptTouchEvent,onTouchEvent这两个方法的关系,如果不清楚,请直接查阅事件传递机制原理) (2)我们要想直接拦截我们的所有触摸事件,我们可以在上层父级布局中进行拦

随机推荐