Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Snapchat-like text on image

I have been trying to implement a Snapchat-like edit text on an image. What I did so far is implement a UILabel in the center of the UIImageView and I added 3 gestures to this UILabel: UIPanGestureRecognizer, UIPinchGestureRecognizer & UIRotationGestureRecognizer.

I have managed to implement the Pan method, but I am having hard time to make the Pinch + Rotation as smooth as they do, I get horrible results T_T

How do you guys think this was made? which components are involved in this & if you have any reading / watching material I could use to accomplish this.

Thanks :)

EDIT:

These are the methods I implemented to handle Pinch & Rotation:

func handlePinch(recognizer: UIPinchGestureRecognizer) {
    if let view = recognizer.view as? UILabel {
        view.transform = CGAffineTransformScale(view.transform, recognizer.scale, recognizer.scale)
    }
}

func handleRotate(recognizer: UIRotationGestureRecognizer) {
    if let view = recognizer.view as? UILabel {
        view.transform = CGAffineTransformRotate(view.transform, recognizer.rotation)
    }
}

Preview video of how the pinch I implemented works: https://drive.google.com/file/d/0B-AVM51jxsvUY2RUUHdWbGo5QlU/view?usp=sharing

enter image description here

like image 693
Erez Hod Avatar asked Dec 22 '15 15:12

Erez Hod


People also ask

Can you remove Snapchat text from a picture?

FAQs about How to Remove Text from Snapchat Screenshot First. go to your Snapchat app and click on memories. Then choose the photo from which you want to remove the caption. Find the “Edit snap” icn=on and click on it. After that, the app will allow you to edit or remove the caption or text on your image.


3 Answers

Found a solution, apparently all I needed to do in the Rotation & Pinch is to always reset the view's rotation / scale. For instance, setting my recognizer.scale to 1.0 and recognizer.rotation to 0.0.

Here is an example of my code:

func handlePan(recognizer: UIPanGestureRecognizer) {
    let translation = recognizer.translationInView(view)
    if let view = recognizer.view {
        view.center = CGPoint(x:view.center.x + translation.x,
            y:view.center.y + translation.y)
    }
    recognizer.setTranslation(CGPointZero, inView: view)
}

func handlePinch(recognizer: UIPinchGestureRecognizer) {
    if let view = recognizer.view as? UILabel {
        let pinchScale: CGFloat = recognizer.scale
        view.transform = CGAffineTransformScale(view.transform, pinchScale, pinchScale)
        recognizer.scale = 1.0
    }
}

func handleRotate(recognizer: UIRotationGestureRecognizer) {
    if let view = recognizer.view as? UILabel {
        let rotation: CGFloat = recognizer.rotation
        view.transform = CGAffineTransformRotate(view.transform, rotation)
        recognizer.rotation = 0.0
    }
}
like image 75
Erez Hod Avatar answered Oct 19 '22 05:10

Erez Hod


For "it scales up / down way too much in a very aggressive way":

You need to handle the pinch gesture scale value according to your need.

From your recogniser method, you get the scale value as:

    var pinchScale: CGFloat = recogniser.scale

You need to modify this value either like decrease it by /10 or /100 as per your need, and use this value in the label transformation instead of using the pangesture scale.

like image 38
Teja Nandamuri Avatar answered Oct 19 '22 03:10

Teja Nandamuri


The issue you have is that your code takes the current transform and adds another transform based on the current "movement", so you accumulate changes (compound them, really) as you move during a single gesture.

Keep instance variables for rotation, scale, and movement, update the relevant one in each of your gesture recognizer's actions (you'll also need to store the state of each at the beginning of each gesture, so you can apply the delta to the initial state), and create the transform from scratch using those three variables. The transform creating should of course be factorized in a separate function, since you're going to use it several times.

like image 1
jcaron Avatar answered Oct 19 '22 03:10

jcaron