Search code examples
iosswiftuitouchcgpoint

Drawing the very first dot on a drawing app?


When I want to make a dot on the canvas, it doesn't appear. Even when I do a single touch, it's as if the program doesn't receive the first CGPoint value. Only when I move my finger do the point values appear (for example: (190.0, 375.5), (135, 234), ...)

DV.swift

class DV: UIView {
var lines: [Line] = []
var firstPoint: CGPoint!
var lastPoint: CGPoint!

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

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    lastPoint = touches.first!.locationInView(self)
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    var newPoint = touches.first!.locationInView(self)

    lines.append(Line(start: lastPoint, end: newPoint))
    lastPoint = newPoint

    self.setNeedsDisplay()
}
override func drawRect(rect: CGRect) {
    var context = UIGraphicsGetCurrentContext()
    CGContextBeginPath(context)
   // print("fine") starts at beginning only

    for line in lines {

        CGContextMoveToPoint(context,line.start.x , line.start.y)
        CGContextAddLineToPoint(context, line.end.x, line.end.y)

    }
    CGContextSetRGBFillColor(context, 0, 0, 0, 1)
    CGContextSetLineCap(context, .Round)
    CGContextSetLineWidth(context, 5)
    CGContextStrokePath(context)
    }
}

Line.swift // My line initializer

class Line {
var start: CGPoint
var end: CGPoint

init(start _start: CGPoint, end _end: CGPoint) {
    start = _start
    end = _end
}
}

Solution

  • You are only using touchesBegan and touchesMoved, not touchesEnded, so if the touch doesn't move and then ends you are basically ignoring it. You need to implement touchesEnded to commit the drawing changes and draw them.