Lost Student
Lost Student

Reputation: 73

Move label position in swift with a gesture

I have a label in my view controller. I am trying to move the position of the label 50 points to the left every time I tap the label. This is what I have so far but my label won't move in the simulation. I do have constraints on the label. It is about 100 wide and 50 in height, and it is also centered in the view controller.

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    let tapGesture = UITapGestureRecognizer(target: gestureLabel, action: #selector(moveLabel))
    gestureLabel.addGestureRecognizer(tapGesture)

}

func moveLabel(){
    if(left){
        moveLeft()
    }
    else{
        moveRight()
    }

}

func moveLeft(){
    let originalX = gestureLabel.frame.origin.x
    if(originalX < 0){
        bringIntoFrame()
    }
    else{
        gestureLabel.frame.offsetBy(dx: -50, dy: 0)
    }
}

Upvotes: 4

Views: 3920

Answers (5)

Boris Legovic
Boris Legovic

Reputation: 220

The label wont move because it has constraints. The easiest way to do this is next:

1) create a label programatically (so you can move it freely around)

    var labelDinamic =  UILabel(frame: CGRectMake(0, 0,200, 200));
    labelDinamic.text = "test text";
    self.view.addSubview(labelDinamic);

2) set label initial position (i suggest to use the position of your current label that has constraints. also, hide you constraint label, because you dont need it to be displayed)

labelDinamic.frame.origin.x = yourLabelWithConstraints.frame.origin.x;
labelDinamic.frame.origin.y = yourLabelWithConstraints.frame.origin.y;

3) now you move your label where ever You want with the property

labelDinamic.frame.origin.x = 123
labelDinamic.frame.origin.y = 200

Upvotes: 1

FreeNickname
FreeNickname

Reputation: 7814

You made a new frame, but didn't assign it to the label. offsetBy doesn't change the frame in place. It creates a new one.

Replace

gestureLabel.frame.offsetBy(dx: -50, dy: 0)

with

gestureLabel.frame = gestureLabel.frame.offsetBy(dx: -50, dy: 0)

But the method above assumes, that you're using directly, not constraints. A standard approach is to have a "Leading to Superview" constraint and change its constant instead of changing the frame.

Upvotes: 0

Manvir Singh
Manvir Singh

Reputation: 139

here You can move label where ever You want it

 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first {
            let position = touch.location(in: self.view)
            print(position.x)
            print(position.y)
            lbl.frame.origin = CGPoint(x:position.x-60,y:position.y-50)
        }
    }

Upvotes: 1

backslash-f
backslash-f

Reputation: 8193

You should be changing the constraint of the label, not the label itself.

Also, your target should be self, not gestureLabel.

Plus, you could animate that. :)

Like so:

class ViewController: UIViewController {

    // Centers the Meme horizontally.
    @IBOutlet weak var centerHorizontalConstraint: NSLayoutConstraint!

    // A custom UIView.
    @IBOutlet weak var okayMeme: OkayMeme!

    override func viewDidLoad() {
        super.viewDidLoad()
        addGestureRecognizer()
    }

    func addGestureRecognizer() {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(moveMeme))
        okayMeme.addGestureRecognizer(tapGesture)
    }

    func moveMeme() {
        UIView.animate(withDuration: 2.0) {
            self.centerHorizontalConstraint.constant -= 50
            self.view.layoutIfNeeded()
        }
    }
}

"Demo":

DEMO

Upvotes: 0

Russian
Russian

Reputation: 1306

UILabel's userInteractionEnabled is false by default. Try setting it to true

Upvotes: 0

Related Questions