使用Quartz2D擦除笔划路径不仅仅是删除路径

时间:2018-03-22 22:47:08

标签: ios swift uikit

我正在尝试为绘图应用设置橡皮擦工具。我一直关注this tutorial的基础知识,但图纸是在白色背景下进行的,因此删除部分未被覆盖(它们以白色绘制以删除) 我一直在实施一种方法来删除我的绘图,它的效果非常好。我绘制一个圆圈,设置颜色和混合模式以清除并设置我想要绘制该圆圈的路径。然后我得到一个方法UIGraphicsGetImageFromCurrentImageContext()返回的图像,它更新了我当前的图像,并在其上面绘制了新图形。 绘制的圆圈它正在完成它的工作并删除它所绘制的位置。但问题是图像开始从右到左被删除,覆盖了它的所有高度,这肯定没有设置在我的代码中的任何地方。 我不知道这是不是一个错误。 我已经尝试了所有内容,但是如果没有右侧的新删除行,我无法从上下文中获取新图像。我画的越多,新线的增长就越多。

the problem

正如你在gif中看到的那样,我看起来像是在白色背景上画灰色,但白色是一个充满白色的图像,它的背景颜色它是灰色的,所以我要删除。 代码:

在UIView(蓝色背景)中,我初始化并添加两个白色列作为子视图:

func addNewColumn(){
    let column : Column = Column.init(frame: CGRect(x: self.frame.size.width*0.7, y: 0, width: self.frame.size.width*0.125, height: self.frame.size.height))
    let column2 : Column = Column.init(frame: CGRect(x: self.frame.size.width*0.2, y: 0, width: self.frame.size.width*0.125, height: self.frame.size.height))
    self.addSubview(column)
    self.addSubview(column2)
}

在类中初始化列:

import UIKit

class Column: UIImageView {

    //Touches Positions
    var firstPoint : CGPoint?
    var lastPoint : CGPoint?

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.isUserInteractionEnabled = true
        self.draw(frame)
        self.backgroundColor = UIColor.gray

    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    //Drawing of the white color in the image, over the blue background
    override func draw(_ rect: CGRect) {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0)
        let context = UIGraphicsGetCurrentContext()
        context?.setFillColor(UIColor.white.cgColor)
        context?.setBlendMode(.normal)
        context?.fill(self.bounds)
        self.image = UIGraphicsGetImageFromCurrentImageContext()
        self.alpha = 1
        UIGraphicsEndImageContext()
    }

    //The method called from touchesMoved() to delete the white color
    func eraseColumn() {

        UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0)
        let context = UIGraphicsGetCurrentContext()
        self.image?.draw(in: self.bounds)
        context?.beginPath()
        context?.addEllipse(in: CGRect(x: (lastPoint?.x)!, y: (lastPoint?.y)!, width: 10, height: 10))
        context?.setLineCap(.round)
        context?.setLineWidth(10)
        context?.setStrokeColor(UIColor.clear.cgColor)
        context?.setBlendMode(.clear)
        context?.strokePath()
        context?.closePath()
        self.image = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext() 
    }
            //Touches handling
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch = touches.first
        firstPoint = touch?.location(in: self)
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch = touches.first
        lastPoint = touch?.location(in: self)
        eraseColumn()
    }
}

正如您在draw(_ rect: CGRect)方法中看到的那样,我用白色填充图像并将其背景颜色设置为灰色。 在eraseColumn()方法中,我删除了用户触摸的白色。无论我尝试什么,图像都会被删除。我根本不知道为什么会这样。 任何帮助将非常感激。 项目是快速3,X-Code 9.2。

1 个答案:

答案 0 :(得分:0)

终于找到了解决方案

更改

self.image?.draw(in: self.bounds)

self.image?.draw(at: self.bounds.origin)

解决了这个问题。希望它会对某人有所帮助。

干杯