博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS: 为画板App增加 Undo/Redo(撤销/重做)操作
阅读量:5979 次
发布时间:2019-06-20

本文共 1141 字,大约阅读时间需要 3 分钟。

这个随笔的内容以上一个随笔为基础,(),上一个随笔实现了一个简单的画板:

 
今天我们要为这个画板增加Undo/Redo操作,当画错了一笔,可以撤销它,或者撤销之后后悔了,还可以还原。而且我们要通过晃动手机来触发Undo/Redo的选择。
 
这个demo使用 实现Undo/Redo操作,NSUndoManager 的实现原理是它作为一个记录器,每次数据变化,我们要用这个记录器记录一个相反的操作,当需要undo的时候,它通过执行这个相反的操作就可以实现了。对于这个画板demo,我们通过把array中的Line首尾连接起来实现的,所以要想还原到上次的状态,我们通过从array中remove最后添加的那条线就可以实现了。
 
NSUndoManager需要两个步骤:
第一步,注册NSUndoManger操作,既上边提到的注册一个相反的操作。(先只实现undo操作)
首先添加一个相反的操作,即一个从array中remove Line的方法,方法名就叫removeLine:
 
然后修改addLine方法,注册刚刚添加的removeLine方法:
 
但是这里有一个问题:因为当手指在屏幕移动的时候,touchMove方法会被持续多次触发,所以画一笔,是由多个Line组成的。所以addLine会调用多次,如果我们直接undo,只是remove掉了一条Line,但是画一笔是由多个Line组成,这样只能移掉一笔中的一部分,即结尾的那部分。
 
那要怎么办呢?如何一次移除多个Line,即画一笔所包含的一组Line。
NSUndoManager有一个分组的概念,就是为了解决这类问题的。
正常情况下,画一笔肯定会触发3个方法,依次是touchBegan, touchMove 和 touchEnd,所以我们可以通过touchBegan和touchEnd就能分辨出画一笔的开始和结束。既:
 
这样我们再执行撤销的时候就是一次remove一组的Line了。
 
第二步,执行Undo
在UI添加一个按钮,作为Undo按钮,按钮的点击事件中简单地调用undo方法就可以了。既:
 
Undo操作这样就算是完成了。
Redo操作和Undo操作道理一样,我们只需要修改下removeLine方法,当remove一条Line的时候,也注册一个相反的操作,即注册addLine方法,修改后的removeLine方法:
 
晃动触发Undo/Redo操作
其实我们根本不需要在UI添加Undo/Redo按钮,直接晃动手机就会自动弹出Undo/Redo选项,而且晃动的功能是自动打开的。
如果需要关闭它,需要设置:
在这个demo中,请不要将此属性设置为NO。
 
最后看下效果:(在模拟器中无法晃动,使用快捷键进行了模拟)
 

 

相关源代码: 

转载地址:http://xeaox.baihongyu.com/

你可能感兴趣的文章
Shell之Sed常用用法
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
mysql开启binlog
查看>>
设置Eclipse编码方式
查看>>
分布式系统唯一ID生成方案汇总【转】
查看>>
并查集hdu1232
查看>>
Mysql 监视工具
查看>>
Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
查看>>
博客搬家了
查看>>
Python中使用ElementTree解析xml
查看>>
linux的日志服务器关于屏蔽一些关键字的方法
查看>>
mysql多实例实例化数据库
查看>>
javascript 操作DOM元素样式
查看>>
HBase 笔记3
查看>>
【Linux】Linux 在线安装yum
查看>>
Atom 编辑器系列视频课程
查看>>
[原][osgearth]osgearthviewer读取earth文件,代码解析(earth文件读取的一帧)
查看>>
mybatis update返回值的意义
查看>>
expdp 详解及实例
查看>>
通过IP判断登录地址
查看>>