Search code examples
iosswiftuipangesturerecognizer

How to add a UIPanGestureRecognizer to an shape drawn on CAShapLayer - swift?


I have an imageView that I have drawn a blue circle in its layer. I would like a user to be able to tap, hold and drag this blue circle anywhere within the UIImageView. I am unsure how to attach this shape to a UIPanGestureRecognizer. My effort so far is below:

class DrawCircleViewController: UIViewController {

    @IBOutlet weak var imgView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // DRAW A FILLED IN BLUE CIRCLE
        drawBlueCircle()

        // ADD GESTURE RECOGNIZER
        let panRecgonizer = UIPanGestureRecognizer.init(target: ???, action: <#T##Selector?#>)

    }

    func drawBlueCircle(){
        let fourDotLayer = CAShapeLayer()
        fourDotLayer.path = UIBezierPath.init(roundedRect: CGRect.init(x: 60, y: 60, width: 30, height: 30), cornerRadius: 50).cgPath
        fourDotLayer.fillColor = UIColor.blue.cgColor
        self.imgView.layer.addSublayer(fourDotLayer)
    }
}

Solution

  • As you might have noticed you can't add GestureRecognizers to CALayers. They can only be added to UIView types.

    The solution is to add a subview to your imageview and draw the blue circle in it.

        var drawingView: UIView?
        override func viewDidLoad() {
            super.viewDidLoad()
            drawingView.frame = imgView.bounds
            imgView.addSubview(drawingView)
            // DRAW A FILLED IN BLUE CIRCLE
            drawBlueCircle()
            // ADD GESTURE RECOGNIZER
            let panRecgonizer = UIPanGestureRecognizer(target: drawingView, action: #selector())
    drawingView.addGestureRecognizer(panRecgonizer)
        }
        func drawBlueCircle(){
            let fourDotLayer = CAShapeLayer()
            fourDotLayer.path = UIBezierPath.init(roundedRect: CGRect.init(x: 60, y: 60, width: 30, height: 30), cornerRadius: 50).cgPath
            fourDotLayer.fillColor = UIColor.blue.cgColor
            drawingView?.layer.addSublayer(fourDotLayer)
        }