Search code examples
swiftuiimageviewgesture

UIImageView with sticker and adding Gesture on Sticker


I have one ImageView and sticker on it now I want to add Gesture on that sticker, Everything is working properly but ,my sticker is going out from UIImageView's layer as shown in Image. I want sticker's gesture within ImageView's Boundaries only.

enter image description here

Following is my Code:

func addStickers(image: UIImage) {

    gesture = "Stickers"

    imgSticker  = UIImageView(frame: CGRect.init(x: 0.0, y: 0.0, width: 80, height: 80))
    imgSticker.center = view.center
    imgSticker.image = image
    imgSticker.contentMode = UIViewContentMode.scaleAspectFill
    imgSticker.isUserInteractionEnabled = true

    self.view.addSubview(imgSticker)
    //imgImage.addSubview(imgSticker)

    panGesture = UIPanGestureRecognizer.init(target: self, action: #selector(handlePanGesture(_:)))
    panGesture.delegate = self

    pinchGesture = UIPinchGestureRecognizer.init(target: self, action: #selector(handlePinchGesture(_:)))
    pinchGesture.delegate = self

    rotateGesture = UIRotationGestureRecognizer.init(target: self, action: #selector(handleRotateGesture(_:)))
    rotateGesture.delegate = self

    imgSticker.addGestureRecognizer(panGesture)
    imgSticker.addGestureRecognizer(pinchGesture)
    imgSticker.addGestureRecognizer(rotateGesture)
}

I am calling this function and my handle methods as below:

                addStickers(image: #imageLiteral(resourceName: "Sticker1.png"))

func handlePanGesture(_ recognizer: UIPanGestureRecognizer) {

    if gesture == "Stickers" {
        let recognizerCenter = recognizer.location(in: self .view)
        imgSticker.center = recognizerCenter

    } else {
        let recognizerCenter = recognizer.location(in: self.view)
        txtLabel.center = recognizerCenter
    }

}

func handlePinchGesture(_ recognizer: UIPinchGestureRecognizer) {
    if gesture == "Stickers" {
         imgSticker.transform = imgSticker.transform.scaledBy(x: recognizer.scale, y: recognizer.scale)
         recognizer.scale = 1.0

    } else {
        txtLabel.transform = txtLabel.transform.scaledBy(x: recognizer.scale, y: recognizer.scale)
        recognizer.scale = 1.0
    }

}

func handleRotateGesture(_ recognizer: UIRotationGestureRecognizer) {

    if gesture == "Stickers" {
         imgSticker.transform = imgSticker.transform.rotated(by: recognizer.rotation)
         recognizer.rotation = 0.0

    } else {
        txtLabel.transform = txtLabel.transform.rotated(by: recognizer.rotation)
        recognizer.rotation = 0.0
    }

}

Solution

  • Try replacing self.view in self.view.addSubview(imgSticker) to the ImageView of your image that is being edited, the one you put stickers onto it. Hope it helps.

    So, it should be like this - imageView.addSubview(stickerOnImg). I had same issue before and this worked for me.