画板例子实现

画板例子思路

步骤一:自定义一个画板视图

步骤二:监听手指触摸事件,当手指在视图滑动的时候,就画线.

2.1在手指开始触摸的时候,创建可变路径,并且设置路径起始点。

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

{

UITouch *touch = [touches anyObject];

CGPoint point = [touch locationInView:self];

SUNBezierPath *path = [SUNBezierPath bezierPathWithWidth:_width andWithColor:_color andWithPoint:point];

_pathU = path;

[self.arrayM addObject:path];

}

2.2.
当手指移动的时候,给路径添加目标点,并且重新绘制视图。

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

{

UITouch *touch = [touches anyObject];

CGPoint point = [touch locationInView:self];

[_pathU addLineToPoint:point];

//
重绘

[self setNeedsDisplay];

}

2.3 当手指触摸结束,将路径保存起来,并释放当前路径

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

[_pathM addObject:_pathU];

CGPathRelease(_pathU.CGPath);

NSLog(@"%s",__func__);

}

注意:

1. [self setNeedsDisplay];这段代码不能少,否则在画板画不出东西。

2.当画板与slider绑定时,要通过awakeFromNib设置线宽,不然线宽默认为0.

- (void)awakeFromNib

{

_width =
2;

}

步骤三:实现绘制视图方法

3.1. 自定义路径类

+ (instancetype)bezierPathWithWidth:(CGFloat)width andWithColor:(UIColor *)color andWithPoint:(CGPoint)point

{

SUNBezierPath *path = [[SUNBezierPath alloc] init];

path.lineWidth = width;

path.color = color;

[path moveToPoint:point];

return path;

}

3.2.实现绘图方法

- (void)drawRect:(CGRect)rect

{

for (SUNBezierPath *path

in
self.arrayM) {

if ([path isKindOfClass:[UIImage class]])  {

UIImage *image = (UIImage *)path;

[image drawAtPoint:CGPointZero];

}else{

[path.color set];

[path stroke];

}

}

步骤四、在storyboard中定义工具栏

4.1 清屏

- (void)clearScreen

{

[self.arrayM
removeAllObjects];

[self
setNeedsDisplay];

}

直接把数组removeAllObjects

4.2 撤销

- (void)undo

{

[self.arrayM
removeLastObject];

[self
setNeedsDisplay];

}

4.3 保存

- (IBAction)save:(id)sender

{

//
截屏

//
开启上下文

UIGraphicsBeginImageContextWithOptions(_drawingView.bounds.size,

NO,
0.0);

//
获得当前上下文

CGContextRef ctr =
UIGraphicsGetCurrentContext();

//
把画板上的内容渲染都上下文

[_drawingView.layer
renderInContext:ctr];

UIImage *newImage =
UIGraphicsGetImageFromCurrentImageContext();

//
关闭上下文

UIGraphicsEndImageContext();

//
保存到相册里面

UIImageWriteToSavedPhotosAlbum(newImage,

self,
@selector(image:didFinishSavingWithError:contextInfo:),

nil);

}

调用MBProgressHUD 第三方框架

- (void)image:(UIImage
*)image didFinishSavingWithError:(NSError
*)error contextInfo:(void
*)contextInfo

{

if (error) {//
保存失败

[MBProgressHUD
showError:@"保存失败"];

}else{//
保存成功

[MBProgressHUD
showSuccess:@"保存成功"];

}

}

4.4 照片

- (IBAction)selectedPicture:(id)sender

{

//
去用户的操作

UIImagePickerController
*picker = [[UIImagePickerController
alloc]
init];

picker.sourceType
=
UIImagePickerControllerSourceTypeSavedPhotosAlbum;

[self
presentViewController:picker
animated:YES
completion:nil];

picker.delegate
=
self;

}

- (void)imagePickerController:(UIImagePickerController
*)picker didFinishPickingMediaWithInfo:(NSDictionary
*)info

{

NSLog(@"%@",info);

UIImage *newImage = info[UIImagePickerControllerOriginalImage];

SUNHandleView *handleV = [[SUNHandleView
alloc]
initWithFrame:self.drawingView.frame];

handleV.delegate
=
self;

handleV.image
= newImage;

[self.view
addSubview:handleV];

[self
dismissViewControllerAnimated:YES
completion:nil];

}

注意:去模拟器用户的相册要遵守UIImagePickerControllerDelegate协议,实现

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info

以modal的形式

[self presentViewController:picker animated:YES completion:nil];

关闭当初Modal出来的控制器

[self dismissViewControllerAnimated:YES completion:nil];

步骤五、实现从相处里面选择一张图片能够用手势操作。

添加手势

- (void)addGestureRecognizer

{

UIPanGestureRecognizer
*pan = [[UIPanGestureRecognizer
alloc]
initWithTarget:self
action:@selector(pan:)];

pan.delegate
=
self;

[_imageView
addGestureRecognizer:pan];

UIRotationGestureRecognizer
*rotation = [[UIRotationGestureRecognizer
alloc]
initWithTarget:self
action:@selector(rotation:)];

rotation.delegate
=
self;

[_imageView
addGestureRecognizer:rotation];

UIPinchGestureRecognizer
*pinch = [[UIPinchGestureRecognizer
alloc]
initWithTarget:self
action:@selector(pinch:)];

pinch.delegate
=
self;

[_imageView
addGestureRecognizer:pinch];

UILongPressGestureRecognizer
*longPress = [[UILongPressGestureRecognizer
alloc]
initWithTarget:self
action:@selector(longPress:)];

longPress.delegate
=
self;

[_imageView
addGestureRecognizer:longPress];

}

- (void)pan:(UIPanGestureRecognizer
*)pan

{

CGPoint point = [pan
translationInView:self];

_imageView.transform
=
CGAffineTransformTranslate(_imageView.transform,
point.x, point.y);

[pan
setTranslation:CGPointZero
inView:_imageView];

}

- (void)rotation:(UIRotationGestureRecognizer
*)rotation

{

_imageView.transform
=
CGAffineTransformRotate(_imageView.transform,
rotation.rotation);

rotation.rotation
=
0;

}

- (void)pinch:(UIPinchGestureRecognizer
*)pinch

{

_imageView.transform
=
CGAffineTransformScale(_imageView.transform,
pinch.scale, pinch.scale);

pinch.scale
=
1;

}

实现长按的操作

- (void)longPress:(UILongPressGestureRecognizer
*)longPress

{

if (longPress.state
==
UIGestureRecognizerStateEnded) {

[UIView
animateWithDuration:0.5
animations:^{

_imageView.alpha
=
0.3;

}
completion:^(BOOL
finished) {

[UIView
animateWithDuration:0.5
animations:^{

_imageView.alpha
=
1;

}
completion:^(BOOL
finished) {

//
截屏

UIGraphicsBeginImageContextWithOptions(self.bounds.size,

NO,
0.0);

CGContextRef ctr =
UIGraphicsGetCurrentContext();

[self.layer
renderInContext:ctr];

UIImage *image =
UIGraphicsGetImageFromCurrentImageContext();

NSData *data =
UIImagePNGRepresentation(image);

[data
writeToFile:@"/Users/sunjinshuai/Desktop/image.png"
atomically:YES];

UIGraphicsEndImageContext();

UIImageWriteToSavedPhotosAlbum(image,

self,
@selector(image:didFinishSavingWithError:contextInfo:),

nil);

//
把图片传给控制器

if ([self.delegate
respondsToSelector:@selector(handleView:withImage:)])
{

[self.delegate
handleView:self
withImage:image];

}

//
从父控件中移除

[self
removeFromSuperview];

}];

}];

}

}

- (void)image:(UIImage
*)image didFinishSavingWithError:(NSError
*)error contextInfo:(void
*)contextInfo

{

if (error) {

[MBProgressHUD
showError:@"保存失败"];

}else{

[MBProgressHUD
showSuccess:@"保存成功"];

}

}

- (BOOL)gestureRecognizer:(UIGestureRecognizer
*)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer
*)otherGestureRecognizer

{

return
YES;

}

- (void)setImage:(UIImage
*)image

{

_image = image;

_imageView.image
= image;

}

- (void)addImageView

{

UIImageView *imageV = [[UIImageView
alloc]
initWithFrame:self.bounds];

imageV.userInteractionEnabled
=
YES;

_imageView = imageV;

[self
addSubview:imageV];

}

时间: 2024-12-20 22:45:05

画板例子实现的相关文章

用SignalR实现的共享画板例子

使用HTML5的canvas画布功能,在页面进行绘画,然后通过SignalR将画布的每个点的颜色提交到服务端,服务端同时将这些画布的信息推送到其他客户端,实现共享同一个画板的功能 类似下图,在某一个浏览器进行绘画,其他浏览器同步显示内容,并且页面刷新或者首次加载还能显示之前的绘画内容(站点不重启的情况下) 实现过程 一.服务端 服务端的代码主要功能是接收客户端发送过来的绘画坐标点和坐标点的颜色,同时将新的坐标点信息推送给客户端,最后服务端还会保存这些绘画坐标点信息到内存中,这样客户端刷新或者首次

html效果

画板教程: http://www.iteye.com/topic/1130792 录音,画板例子:http://chengxinwei.github.io/categories.html

Swift3.0学习实践-一个简单的画板(七色轨迹、可撤销、可清除、带橡皮擦)

写着玩儿的小程序,继续学习Swift.运行效果+代码+知识点总结 运行效果:             代码: Canvas类:画布,画图板状态管理.交互.处理手势 [plain] view plain copy class Canvas:UIView{ //负责线条的生成.操作与管理 let pathCreator:PathCreator //是否处于擦除状态 var isInErasering:Bool //橡皮擦视图 let eraserView:UIView override init(f

android源码大放送(实战开发必备),免费安卓demo源码,例子大全文件详细列表

免费安卓demo源码,例子大全文件详细列表 本列表源码永久免费下载地址:http://www.jiandaima.com/blog/android-demo 卷 yunpan 的文件夹 PATH 列表 卷序列号为 0000-73EC E:. │ jiandaima.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2016.03.10更新.txt │ ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签

Html5新特性 <canvas>画板画直线

 下面例子为用canvas标签画多条直线 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht

用Java语言编写一个简易画板

讲了三篇概博客的概念,今天,我们来一点实际的东西.我们来探讨一下如何用Java语言,编写一块简易的画图板. 一.需求分析 无论我们使用什么语言,去编写一个什么样的项目,我们的第一步,总是去分析这个项目需要满足怎样的需求. 那么,画板需要满足怎样的需要呢?换句话说,在画板上,我们应该赋予它什么功能呢?从我们熟悉的画板来看,我们需要实现诸如铅笔.橡皮.喷枪.刷子的功能,我们可以画出一些规则的图形,比如直线.矩形.圆.最好我们还能调整画笔的颜色和粗细.以上,我们希望的是,当我们点击一个按钮的时候,我们

C#实例.net_经典例子400个

一共470多例winform 界面特效的源码. 窗体与界面设计... 9 实例001  带历史信息的菜单    10 实例002  菜单动态合并    12 实例003  像开始菜单一样漂亮的菜单... 14 实例004  任务栏托盘菜单    15 实例005  可以拉伸的菜单界面    16 实例006  菜级联菜单    18 1.2  工具栏设计... 19 实例007  带带背景的工具栏    19 实例008  带浮动工具栏    20 实例009  在带下拉菜单的工具栏... 21

几何画板中该如何插入公式

在使用几何画板制作课件的过程中,可能会经常使用到某些数学公式或符号,那么该如何将数学公式插入到几何画板呢?下面给大家介绍两种方法,都是非常实用的,希望对大家学习几何画板有帮助. 方法一 导入法 像导入外部图片一样,将Word或WPS中的数学公式或符号,导入到几何画板的课件中.  可以先在Word或WPS中将数学公式编辑好,然后执行复制命令,在几何画板中粘贴即可将公式作为图片导入.  从Word中导入公式示例 方法二 “编辑数学格式文本”法 其实几何画板中提供了输入常用数学公式或符号命令,只是初学

怎么用几何画板创建滑行反射变换

对于几何画板很多的用户不仅会用到平移.旋转.缩放.反射和迭代这些,如果有需求的话还可以通过“创建自定义变换”,建立新的变化规则来满足自己实现对象的变换.其实这就是自定义变换.对于自定义变换的例子有很多,下面本几何画板教程将以利用几何画板创建滑行反射变换为例作详细讲解. 具体的操作步骤如下: 步骤一 在绘图区域构造一条竖直的直线AB(按住Shift+构造直线),并且在右边构造一点C.  构造垂直的直线AB和点C示例 步骤二 选定点A.点B,执行“标记向量”,把点C按标记向量平移得到C'.再标记直线