web-dev-qa-db-fra.com

commence, touche, fin, touchefaire pour déplacer UIView

Je dois faire glisser mon objet UIView. J'utilise ce code, mais ça ne marche pas 

float oldX, oldY;
BOOL dragging;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:self];

    if ([[touch.view class] isSubclassOfClass:[UILabel class]]) {
        UILabel *label = (UILabel *)touch.view;
        if (CGRectContainsPoint(label.frame, touchLocation)) {
            dragging = YES;
            oldX = touchLocation.x;
            oldY = touchLocation.y;
        }
    }


}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    dragging = NO;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:self];

    if ([[touch.view class] isSubclassOfClass:[UILabel class]]) {
        UILabel *label = (UILabel *)touch.view;

        if (dragging) {
            CGRect frame = label.frame;
            frame.Origin.x = label.frame.Origin.x + touchLocation.x - oldX;
            frame.Origin.y =  label.frame.Origin.y + touchLocation.y - oldY;
            label.frame = frame;
        }

    }


}
20
Matrosov Alexander

Il y a quelque chose d'un peu étrange dans votre code.

Vous demandez l'emplacement dans self, une UIView qui contient vraisemblablement la UILabel que vous voulez vérifier. Cela soulève la question de savoir pourquoi vous n’ajoutez pas le touchesXXX à une sous-classe de votre UILabel.

Ceci annule votre utilisation du label.frame qui est défini en fonction de ses superview.bounds (votre parent UIView à qui vous avez demandé l'emplacement de contact), mais cela ne constitue pas le moyen le plus direct de suivre ce qui est passe.

0
verec

Je suggérerais d'utiliser un UIPanGestureRecognizer:

-(void)dragging:(UIPanGestureRecognizer *)gesture
{
    // Check if this is the first touch
    if(gesture.state == UIGestureRecognizerStateBegan)
    {
        // Store the initial touch so when we change positions we do not snap
        self.panCoord = [gesture locationInView:gesture.view];
        [self.view bringSubviewToFront:gesture.view];

    }

    CGPoint newCoord = [gesture locationInView:gesture.view];

    // Create the frame offsets to use our finger position in the view.
    float dX = newCoord.x-self.panCoord.x;
    float dY = newCoord.y-self.panCoord.y;

    gesture.view.frame = CGRectMake(gesture.view.frame.Origin.x+dX,
                                    gesture.view.frame.Origin.y+dY,
                                    gesture.view.frame.size.width, 
                                    gesture.view.frame.size.height);
}

Ceci est juste une de mes préférences. Pour moi, il est beaucoup plus simple d’utiliser un identificateur de gestes puis touchesBegan, touchesEnded, touchesMoved Je les utiliserai dans les cas où UIPanGestureRecognizer ne fonctionnera pas.

15
Jaybit

C'est le code de travail pour déplacer des objets UIView

float oldX, oldY; BOOL en train de glisser;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:touch.view];
    if ([[touch.view class] isSubclassOfClass:[UILabel class]]) {
        dragging = YES;
        oldX = touchLocation.x;
        oldY = touchLocation.y;
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    dragging = NO;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:touch.view];    
    if ([[touch.view class] isSubclassOfClass:[UILabel class]]) {
        UILabel *label = (UILabel *)touch.view;
        if (dragging) {
            CGRect frame = label.frame;
            frame.Origin.x = label.frame.Origin.x + touchLocation.x - oldX;
            frame.Origin.y = label.frame.Origin.y + touchLocation.y - oldY;
            label.frame = frame;
        }
    }
}
14
Matrosov Alexander

Avec ce code, je peux déplacer mon objet UIView n’importe où ... .. Mon ViewController.Swift ressemble à ceci. 

// code from below

import UIKit

class ViewController: UIViewController {

    var location = CGPoint(x: 0, y: 0)

    @IBOutlet weak var Person: UIImageView!

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

        var touch : UITouch! =  touches.first! as UITouch

        location = touch.location(in: self.view)

        Person.center = location

    }

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

        var touch : UITouch! =  touches.first! as UITouch

        location = touch.location(in: self.view)

        Person.center = location
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        Person.center = CGPoint(x: 160, y: 330)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

//ends

J'espère que cela vous aidera bien que ce soit une autre façon de le faire que celle mentionnée en question.

0
Nappa