Создайте функцию для отмены чертежа UIBezierPath - PullRequest
0 голосов
/ 25 октября 2019

Мой код ниже в 2 отдельных классах. Из класса gooGoo я хочу иметь возможность вызывать func change, который будет использоваться как кнопка отмены к тому, что было нарисовано в uiview. Большинство свойств uiview подклассифицированы в classDrawingView.

Я не видел никаких предыдущих вопросов по этому вопросу, используя UIBezierPath.

class gooGoo : UIViewController{
    var myLayer = CALayer()
    var path = UIBezierPath()
    var startPoint = CGPoint()
    var touchPoint = CGPoint()
    var drawPlace = DrawingView()

        func Change(){
            drawPlace.drawColor = UIColor.black
        }

    }
class DrawingView: UIView {

var drawColor = UIColor.black
var lineWidth: CGFloat = 5

private var lastPoint: CGPoint!
private var bezierPath: UIBezierPath!
private var pointCounter: Int = 0
private let pointLimit: Int = 128
private var preRenderImage: UIImage!

// MARK: - Initialization

override init(frame: CGRect) {
    super.init(frame: frame)

    initBezierPath()


}




func takeSnapshotOfView(view:UIView) -> UIImage? {
    UIGraphicsBeginImageContext(CGSize(width: view.frame.size.width, height: view.frame.size.height))
    view.drawHierarchy(in: CGRect(x: 0, y: 0.0, width: view.frame.size.width, height: view.frame.size.height), afterScreenUpdates: true)

    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()




    return image
}

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

    initBezierPath()
}

func initBezierPath() {
    bezierPath = UIBezierPath()
    bezierPath.lineCapStyle = CGLineCap.round
    bezierPath.lineJoinStyle = CGLineJoin.round
}

// MARK: - Touch handling

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch: AnyObject? = touches.first
    lastPoint = touch!.location(in: self)
    pointCounter = 0
}

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

    bezierPath.move(to: lastPoint)
    bezierPath.addLine(to: newPoint)
    lastPoint = newPoint

    pointCounter += 1

    if pointCounter == pointLimit {
        pointCounter = 0
        renderToImage()
        setNeedsDisplay()
        bezierPath.removeAllPoints()
    }
    else {
        setNeedsDisplay()
    }
    }

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    pointCounter = 0
    renderToImage()
    setNeedsDisplay()
    bezierPath.removeAllPoints()
}

override func touchesCancelled(_ touches: Set<UITouch>?, with event: UIEvent?) {
    touchesEnded(touches!, with: event)
}

// MARK: - Pre render

func renderToImage() {

    UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0.0)
    if preRenderImage != nil {
        preRenderImage.draw(in: self.bounds)
    }

    bezierPath.lineWidth = lineWidth
    drawColor.setFill()
    drawColor.setStroke()

    bezierPath.stroke()

    preRenderImage = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()
}

// MARK: - Render

override func draw(_ rect: CGRect) {
    super.draw(rect)

    if preRenderImage != nil {
        preRenderImage.draw(in: self.bounds)
    }

    bezierPath.lineWidth = lineWidth
    drawColor.setFill()
    drawColor.setStroke()
    bezierPath.stroke()
}

// MARK: - Clearing

func clear() {
    preRenderImage = nil
    bezierPath.removeAllPoints()
    setNeedsDisplay()
}

// MARK: - Other

func hasLines() -> Bool {
    return preRenderImage != nil || !bezierPath.isEmpty
}
}
...