文档章节

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

云贵高原
 云贵高原
发布于 2014/09/26 10:33
字数 291
阅读 314
收藏 5
  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。

© 著作权归作者所有

云贵高原

云贵高原

粉丝 83
博文 38
码字总数 21429
作品 12
海淀
技术主管
私信 提问
TouchVG 1.1.0 支持Undo/redo,增加高性能绘图视图

TouchVG发布一个大版本,新增下列功能: 1、无限步Undo/redo操作。自动监控图形的改变情况,异步增量记录改变数据,不影响绘图命令。 2、在Android上增加双层SurfaceView,即使在高清屏低配平...

云贵高原
2014/01/31
1K
1
iOS矢量绘图样例--vgios_examples

iOS矢量绘图样例 基于 TouchVG for iOS 开源框架的矢量绘图应用样例项目,可快速开发绘图App。 例1:使用StoryBoard绘图 例2:增加Undo/Redo功能 例3:绘图命令按钮栏 例4:绘图菜单和设置菜...

云贵高原
2014/10/14
1K
0
iOS的绘图机制-iOS,iPad,iPhone,Objective-c

嘿!我又回来了。 在前面我介绍了iOS的视图机制,我也提到了iOS的视图框框可以通过drawRect自己绘图,我也说过每个view的layer(CALayer)就像一个视图的投影,其实我们也可以来操作它定制一...

晨曦之光
2012/05/28
2.9K
0
iO6 Programming pushing the limits 阅读笔记

目录 第一部分 iOS6新内容 第二部分 从每天工具中获取更多(介绍日常使用控件和框架的潜力) 第三部分 完成任务的正确工具(介绍不是那么常用的控件和框架) 第四部分 发挥到极限(深入理解i...

云飞扬v5
2015/11/09
56
0
[C++][IO]fstream用法

fstream用法 1. 打开文件 在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是: void open(const char* filename,int mode,int access); 参数: filename:  要打开的文件...

guitar_zp
2011/08/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

02.日志系统:一条SQL更新语句是如何执行的?

我们还是从一个表的一条更新语句说起,我们创建下面一张表: create table T(ID int primary key, c int); 如果要将ID=2这一行c的值加1,SQL可以这么写: update T set c=c+1 where ID=2; 前...

scgaopan
今天
9
0
【五分钟系列】掌握vscode调试技巧

调试前端js 准备一个前端项目 index.html <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1......

aoping
今天
8
0
PhotoShop 高级应用:USM锐化/S锐化/防抖

、 高反差锐化+混合模式:叠加模式 【将更多的边缘细节添加到图像中】

东方墨天
今天
9
0
Python数据可视化之matplotlib

常用模块导入 import numpy as npimport matplotlibimport matplotlib.mlab as mlabimport matplotlib.pyplot as pltimport matplotlib.font_manager as fmfrom mpl_toolkits.mplot3d i......

松鼠大帝
昨天
7
0
我用Bash编写了一个扫雷游戏

我在编程教学方面不是专家,但当我想更好掌握某一样东西时,会试着找出让自己乐在其中的方法。比方说,当我想在 shell 编程方面更进一步时,我决定用 Bash 编写一个扫雷游戏来加以练习。 我在...

老孟的Linux私房菜
昨天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部