`撤消油漆操作

时间:2014-02-15 10:28:49

标签: ios uiimage undo

我正在使用此链接(http://www.raywenderlich.com/18840/how-to-make-a-simple-drawing-app-with-uikit)来制作绘画应用程序,我也想执行撤消操作。

我使用此代码将用户创建的每个草图保存在一个可变的`array [completeLines]中。 这些更改在touchesEnded方法

中完成
**UIGraphicsBeginImageContextWithOptions(_tempDrawImage.bounds.size, NO,0.0);
[_tempDrawImage.image drawInRect:CGRectMake(0, 0, _tempDrawImage.frame.size.width, _tempDrawImage.frame.size.height)];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
[completeLines addObject:image];**

并且,在按下撤消按钮时,我想从视图中删除最后一个草图。 帮助我从可变数组中取出图像引用并将其从视图中删除。

1 个答案:

答案 0 :(得分:0)

虽然你正在做的事情可能会在短期内发挥作用,但当你有太多的图像存储时(无论是在内存中还是在磁盘上),它最终都会失败。因此,在前进中,您需要以其他格式存储绘图历史信息。

无论如何,基本上,你撤消时想要:

  1. 从阵列中删除当前(最后)图像(取决于添加图像的时间)
  2. 将整个视图设置为需要显示
  3. 从阵列中获取新的最后一张图片
  4. 用该图像替换当前图纸视图内容
  5. 替换图纸视图内容意味着清除图纸上下文并将保存的图像绘制到图纸中。这可能有点混乱,因为它意味着在drawRect:方法中使用逻辑(假设您没有用于绘制的后备层)。您可以保存一个表示重绘的属性,然后:

    if (self.redraw) {
        // clear the context
        // draw the last image
    
        self.redraw = NO;
    }
    
    // draw your new painting (appending to the graphics context)
    

    将“承诺”内容与当前绘画(正在进行的触摸结果)分开会更好。现在,当您在drawRect:之外撤消时,更新后备layer以回滚内容。这意味着drawRect:没有任何逻辑,因为它只是一直绘制已提交的内容和当前内容。这可以通过2个CALayer个实例来完成,1个带有content个图像,1个带有delegate来绘制当前绘图。