【问题标题】:Adding undo function to drawing app为绘图应用程序添加撤消功能
【发布时间】:2015-08-12 15:10:09
【问题描述】:

我关注raywenderlich tutorial 使用 UIKit 制作绘图应用程序。我现在正在尝试添加功能以撤消最后一笔。理想情况下,我想撤消多达 10 次笔画。我试图弄清楚这样做的最佳方法是什么。我正在考虑创建另一个只有最后一笔的 ImageView 并在用户按下时制作ImageView.image = nil。在教程中的代码中有类似的东西。当触摸结束时,最新的笔画被合并到图像视图中,所有旧的笔画都处于正确的不透明度。我不确定如何将第三个(可能更多)imageivews 添加到此代码中以使其正常工作。有什么想法/更好的方法来解决这个问题吗? touchesEnded 的代码如下。

代码

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {

        if !swiped {
            // draw a single point
            drawLineFrom(lastPoint, toPoint: lastPoint)
        }

        // Merge tempImageView into mainImageView
        UIGraphicsBeginImageContext(mainImageView.frame.size)
        mainImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: 1.0)
        tempImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: opacity)
        mainImageView.image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        tempImageView.image = nil
    }

【问题讨论】:

  • 这里的小贴士:nshipster.com/nsundomanager
  • 您可能希望将绘图数据保存在 Core Data 中,因为 Core Data 具有用于撤消、重做和保存的简洁功能。

标签: swift drawing undo


【解决方案1】:

@SpaceShroomies:我发现/想出了一个很好的解决方案..

我使用了来自nsHiptserRaywenderlich tutorial 的部件。

这是我的解决方案:

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    //undoManager
    let undo: UIImageView = undoManager?.prepareWithInvocationTarget(Temp2Image) as! UIImageView

    UIGraphicsBeginImageContext(Temp2Image.frame.size)
    Temp2Image.image?.drawInRect(CGRect(x: 0, y: 0, width: Temp2Image.frame.size.width, height: Temp2Image.frame.size.height), blendMode: kCGBlendModeNormal, alpha: 1.0)
    TempImage.image?.drawInRect(CGRect(x: 0, y: 0, width: TempImage.frame.size.width, height: TempImage.frame.size.height), blendMode: kCGBlendModeNormal, alpha: opacity)
    undo.image = Temp2Image.image
    Temp2Image.image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    TempImage.image = nil
}

这里重要的是设置UNDO应该回到什么,即undo.image = Temp2Image.image 否则它不会变回“它”

【讨论】:

  • 顺便说一句。我不是你swipebool,但无论如何我应该工作得很好
【解决方案2】:

因此,我设法使撤消功能向后退了一步,方法是使用 UIImageView 存储最后一个笔划,然后在下一个笔划完成时将其添加到其余笔划中...使用会不会有问题同样的技术倒退10步?我需要 10 个 UIImageViews ......那会效率低下/导致崩溃吗?代码如下:

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {

        if !swiped {
            // draw a single point
            drawLineFrom(lastPoint, toPoint: lastPoint)
        }


        UIGraphicsBeginImageContext(mainImageView.frame.size)
        mainImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: 1.0)
        undo1.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: 1.0)
        mainImageView.image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        undo1.image = nil

        UIGraphicsBeginImageContext(undo1.frame.size)
        undo1.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: 1.0)
        tempImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: opacity)
        undo1.image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        tempImageView.image = nil
    }

【讨论】:

  • 你走错了路。您需要 1 个自定义视图,您可以在其中覆盖绘图功能。您保留一组代表您的图像的点或路径。每次从该数组中添加或减去时,都会重绘视图。
猜你喜欢
  • 2017-07-19
  • 2013-02-03
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 2016-11-12
  • 2014-12-21
相关资源
最近更新 更多