whgnsdlr7
whgnsdlr7

Reputation: 77

touchesBegan and touchesMoved not getting triggered on UIView

What I'm trying to achieve:

Trying to grab the coordinate of the currently touched area on the screen and draw the received coordinate on the screen. Simply put, a basic drawing app that's all written programmatically (for my own practice).

Problem

touchesBegan and touchesMoved for PaintingSubclass are not getting called at all.

Current setup

What I've tried so far

Current Code

(please ignore any the unnecessary variables)

import UIKit

class PaintingViewController: UIViewController{

var _paintView: PaintingSubclass? = nil

override func loadView() {
    view = UILabel()
}

private var labelView: UILabel {
    return view as! UILabel
}

override func viewDidLoad() {

    _paintView = PaintingSubclass()
    _paintView?.frame = CGRect(x: view.bounds.minX, y: view.bounds.minY, width: 400, height: 750)
    _paintView?.backgroundColor = UIColor.white
    _paintView?.setNeedsDisplay()

    view.addSubview(_paintView!)
}

class PaintingSubclass: UIView{

    private var context: CGContext? = nil
    var styleSelection: String = "buttcap"
    var linewidth: Float = 5
    var lineCapStyle: CGLineCap? = nil
    var lineJoinStyle: CGLineJoin? = nil
    var lineWidthValue: CGFloat? = nil
    var colorValue: UIColor? = nil

    override init(frame: CGRect) {
        super.init(frame: frame)
        lineWidthValue = 0.5
        colorValue = UIColor(cgColor: UIColor.black.cgColor)
        self.isUserInteractionEnabled = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func draw(_ rect: CGRect) {

        context = UIGraphicsGetCurrentContext()!
        context?.move(to: CGPoint(x: 0.0, y: 110.0))
        context?.setStrokeColor((colorValue?.cgColor)!)
        context?.drawPath(using: CGPathDrawingMode.stroke)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        let touch: UITouch = touches.first!
        let touchPoint: CGPoint = touch.location(in: self)

        let _xValue = touchPoint.x
        let _yValue = touchPoint.y

        NSLog("coordinate: \(_xValue), \(_yValue)")
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesMoved(touches, with: event)

        let touch: UITouch = touches.first!
        let touchPoint: CGPoint = touch.location(in: self)

        let _xValue = touchPoint.x
        let _yValue = touchPoint.y

        NSLog("coordinate: \(_xValue), \(_yValue)")
    }   
}
}

What am I doing wrong here? Been stuck in this state for hours not making any progress. Any help/feedbacks will be much appreciated.

Upvotes: 3

Views: 2959

Answers (4)

KrishnaCA
KrishnaCA

Reputation: 5695

I don't know why you are setting your default view to UILabel(), but your default isUserInteractionEnabled of your view is false. Set it to true

override func loadView() {
    view = UILabel()
    view.isUserInteractionEnabled = true
}

Upvotes: 1

Alfy
Alfy

Reputation: 899

The problem lies on:

//    override func loadView() {
//        view = UILabel()
//    }
//    
//    private var labelView: UILabel {
//        return view as! UILabel
//    }

You turn the view controller's self view object to a UILabel object.

Upvotes: 1

simonWasHere
simonWasHere

Reputation: 1340

It would be better to have your painting view as the main view in the view controller and the UILabel as a subview of the painting view. The UILabel needs to have userInteractionEnabled in your current layout, but instead of changing that switch the layout around.

Apart from anything else, presumably you don't want the painting view to draw over the label, but rather the label to be drawn on top, so the label should be the subview.

Upvotes: 0

Guan
Guan

Reputation: 148

According to your code, your PaintingViewController's view is a UILabel, the property isUserInteractionEnabled default is false.Try to set this property to true may help you.

Upvotes: 1

Related Questions