iOS绘图例2:增加Undo/Redo功能

  1. 在工程中添加Undo、Redo的按钮图片,每个按钮都有可用和不可用两种状态图片,共4个图片。
  2. 在StoryBoard中添加两个按钮,设置图片属性和自动布局约束。
  3. 按住 Ctrl 拖动按钮到 ViewController.mm 中,创建属性变量和动作方法。
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIButton *undoButton;
    @property (weak, nonatomic) IBOutlet UIButton *redoButton;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    - (IBAction)undo:(id)sender {
    }
    
    - (IBAction)redo:(id)sender {
    }
    
    @end
  4. 在 ViewController.mm 中导入 GiViewHelper.h,在 viewDidLoad 中启用Undo功能,实现Undo/Redo按钮方法:
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        NSString *path = [LIBRARY_FOLDER stringByAppendingString:@"undo"];
        [[GiViewHelper sharedInstance]startUndoRecord:path];
    }
    
    - (IBAction)undo:(id)sender {
        [[GiViewHelper sharedInstance]undo];
    }
    
    - (IBAction)redo:(id)sender {
        [[GiViewHelper sharedInstance]undo];
    }

    运行程序,画几个图,试试Undo/Redo按钮吧。虽然能工作了,但按钮可用状态未显示出来。

  5. 在 ViewController 中实现 GiPaintViewDelegate 观察者协议的 onContentChanged: 方法,注册此观察者。
    @interface ViewController ()<GiPaintViewDelegate>
    ...
    - (void)viewDidLoad {
        [super viewDidLoad];
        ...
        GiViewHelper *hlp = [GiViewHelper sharedInstance];
    
        [hlp startUndoRecord:[LIBRARY_FOLDER stringByAppendingString:@"undo"]];
        [hlp addDelegate:self];
        [self onContentChanged:hlp.view];
    }
    
    - (void)onContentChanged:(id)view {
        GiViewHelper *hlp = [GiViewHelper sharedInstance];
        self.undoButton.enabled = [hlp canUndo];
        self.redoButton.enabled = [hlp canRedo];
    }

样例代码见 GitHubOSC,欢迎 Fork。

时间: 2024-10-24 11:38:10

iOS绘图例2:增加Undo/Redo功能的相关文章

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

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

undo/redo功能的原理和思路

一些具有操作记录的系统,如店铺装修.富文本编辑等,都具有undo/redo功能,可实现界面操作过程的撤销和恢复,简述开发undo/redo功能的原理和思路. undo是将用户上一步做的操作对程序造成的改动恢复到改动之前,而redo操作是指重新实现这种改动. undo/redo操作的实现方式分为两类:记录数据和记录操作. 记录数据是指将信息编辑窗口打开时,保存原始数据,然后记录用户每次操作后的结果数据,这里的数据是指信息编辑窗口中所有可能发生变动的数据.做undo操作时程序将用户上一步操作前的数据

iOS绘图例1:使用StoryBoard

使用 Single View Wizard 等向导创建工程 在 Podfile 文件中导入TouchVG: platform :ios, '6.0' pod 'TouchVG' 然后运行pod install下载TouchVG代码.后续可运行 pod update --no-repo-update 加快下载速度,不用每次检查最新版本. 然后打开 *.xcworkspace 进入 Xcode. 将 ViewController.m改为ViewController.mm.TouchVG是用C++实现

iOS绘图例3:绘图命令工具栏

在StoryBoard中添加 GiCanvasView 视图,并在 ViewController 中创建关联变量 canvas_: @interface ViewController () { __weak IBOutlet GiCanvasView *canvas_; } @end 添加按钮图片资源,设置命令工具栏: - (void)viewDidLoad { [super viewDidLoad]; canvas_.tools = @[ @{@"image" : @"se

转:C#中Undo/Redo的一个简易实现

一个比较常见的改进用户体验的方案是用Redo/Undo来取代确认对话框,由于这个功能比较常用,本文简单的给了一个在C#中通过Command模式实现Redo/Undo方案的例子,以供后续查询. class Program { static void Main(string[] args) { var cmds = new CommandManager(); while (true) { var key = Console.ReadKey(true); if (key.KeyChar >= '0'

文字录入无限制Undo,Redo的实现

这里只针对Edit的内容做一个简单的undo,redo功能: 原理就是,将新增字符和相关信息添加到undo列表,在undo动作时,取记录信息,并在edit中删除新增的字符,然后将此动作添加到redo列表,以便恢复. 本程序只对文本框文字的顺序增加做了处理,对于任意位置的删除,复制粘贴等没有进行处理,大家可以根据实际情况完善,增加辅助信息来完成对撤销和恢复的操作. 明白了原理,对于其他的操作都是这个道理,比如你画图什么的,保留每个图形的相关信息,然后撤销恢复重画,说的简单,做起来还是需要我们动脑子

卓流应用网新功能推广——ECMALL商城增加微信商城功能

微信商城是基于当前很受欢迎的微信的这种传媒方式中的一种商业运用,微信的当前的火热是一个商机,基于微信的传播速度,及其简便等优点,为商家提供一个平台,在这个更简便的.方便的平台里进行更为现代的电子商务.同时在利用微信的这个平台也可以为商家提供更有效的宣传方式,更有利于商品的推广. 同时尽快实现商业价值是重要的阶段目标,通过微信平台实现在线销售便是一个方向.于是诞生了微信商城这个平台! 微网站一种跨移动平台的营销型网站.它源于WebApp和网站的融合创新,兼容iOS.android.WP等各大操作系

【转载】MySQL 日志 undo | redo

本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC). - 事务的原子性(Atomicity)  事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作.如果在执行的过程中发生  了错误,要回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过. - 原理  Undo Log的原理很简单,为了满

seci-log 1.11 发布,日志分析软件增加 ftpserver 等功能

日志分析软件 seci-log 1.11发布,增加了增加了ftpserver,远程ftp,sftp采集简化配置等功能. 配置文件application.properties做了简化操作. 1.对系统用到的端口采用了默认处理,这样可以不需要在配置端口了. 2.本机ip如果不配置,则获取本机第一块网卡的ip地址. 3.增加了server=syslog|remote|file|ftpserver|snmp的配置,通过减少里面的内容可以启动部分内容,也可以拆分出来进行多进程启动. 取消了file.pro