2012-02-14 8 views
35

mi sto muovendo le mie opinioni daUnire gesto longpress e movimento di trascinamento insieme

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveRight:)]; 
[panRecognizer setMinimumNumberOfTouches:1]; 
[panRecognizer setMaximumNumberOfTouches:1]; 
[panRecognizer setDelegate:self]; 
[bubbleView[rightCnt] addGestureRecognizer:panRecognizer]; 
[panRecognizer release]; 

Ora, voglio fare stessa cosa da trascinare con pressione prolungata.

Qualche idea?

risposta

74

UILongPressGestureRecognizer fa già quello che vuoi per te. Dai un'occhiata alla proprietà UIGestureRecognizerState. Da documentation:

I gesti a pressione prolungata sono continui. Il gesto inizia (UIGestureRecognizerStateBegan) quando il numero di dita consentite (numberOfTouchesRequired) è stato premuto per il periodo specificato (minimumPressDuration) ei tocchi non si spostano oltre l'intervallo consentito di movimento (consentito). Il gesto transizioni di riconoscimento allo stato Modifica ogni volta che un dito si sposta, e termina (UIGestureRecognizerStateEnded) quando viene sollevata una delle dita .

Quindi, in sostanza, dopo il vostro selettore UILongPressGestureRecognizer è chiamato ascoltate UIGestureRecognizerStateBegan, UIGestureRecognizerStateChanged, UIGestureRecognizerStateEnded. Continua a cambiare la cornice delle visualizzazioni durante lo UIGestureRecognizerStateChanged.

- (void)moveRight:(UILongPressGestureRecognizer *)gesture 
{ 
    if(gesture.state == UIGestureRecognizerStateBegan) 
    { 
     //if needed do some initial setup or init of views here 
    } 
    else if(gesture.state == UIGestureRecognizerStateChanged) 
    { 
     //move your views here. 
     [yourView setFrame:]; 
    } 
    else if(gesture.state == UIGestureRecognizerStateEnded) 
    { 
     //else do cleanup 
    } 
} 
+3

sto usando \t CGPoint translatedPoint = [(UILongPressGestureRecognizer *) mittente translationInView: self.view] ; ma a lungo premere quello che devo usare? – PJR

+0

try '[yourView setFrame: CGRectMake (xCoord, yCoord, height, width)]' –

+3

ma da questo come posso ottenere tradottoPoint – PJR

33
@implementation MyViewController { 
    CGPoint _priorPoint; 
} 

- (void)moveRight:(UILongPressGestureRecognizer *)sender { 
    UIView *view = sender.view; 
    CGPoint point = [sender locationInView:view.superview]; 
    if (sender.state == UIGestureRecognizerStateChanged) { 
     CGPoint center = view.center; 
     center.x += point.x - _priorPoint.x; 
     center.y += point.y - _priorPoint.y; 
     view.center = center; 
    } 
    _priorPoint = point; 
} 
+0

œrob: quella è la risposta giusta! molte grazie! – rockstarberlin

2

Non è necessario dichiarare _priorPoint;

Nel mio caso, voglio solo che la vista si sposti orizzontalmente, quindi sto solo cambiando la coordinata x.

Ecco la mia soluzione:

if (longpressGestRec.state == UIGestureRecognizerStateChanged) 
    { 
     UIView *view = longpressGestRec.view; 

     // Location of the touch within the view. 
     CGPoint point = [longpressGestRec locationInView:view]; 

     // Calculate new X position based on the amount the gesture 
     // has moved plus the size of the view we want to move. 
     CGFloat newXLoc = (item.frame.origin.x + point.x) - (item.frame.size.width/2); 
     [item setFrame:CGRectMake(newXLoc, 
            item.frame.origin.y, 
            item.frame.size.width, 
            item.frame.size.height)]; 
    } 
+2

la tua soluzione funziona solo per un 'UIView' seguendo il dito. Immagina di avviare 'UILongPress' dall'angolo di un'immagine e vuoi scorrere a sinistra, questa immagine salta alla posizione del tuo dito. Nel mio caso, ho dovuto usare una soluzione '_priorPoint'. – Fabio

+0

Ottimo punto! Completamente mancato, grazie! – Andrew

1

In Swift questo può essere realizzato utilizzando il codice qui sotto

class DragView: UIView { 
    // Starting center position 
    var initialCenter: CGPoint? 

    override func didMoveToWindow() { 
    super.didMoveToWindow() 
    // Add longPress gesture recognizer 
    let longPress = UILongPressGestureRecognizer(target: self, action: #selector(longPressAction(gesture:))) 
    addGestureRecognizer(longPress) 
    } 

    // Handle longPress action 
    func longPressAction(gesture: UILongPressGestureRecognizer) { 
    if gesture.state == .began { 
     guard let view = gesture.view else { 
      return 
     } 
     initialCenter = gesture.location(in: view.superview) 
    } 
    else if gesture.state == .changed { 
     guard let originalCenter = initialCenter else { 
      return 
     } 

     guard let view = gesture.view else { 
      return 
     } 

     let point = gesture.location(in: view.superview) 

     // Calculate new center position 
     var newCenter = view.center; 
     newCenter.x += point.x - originalCenter.x; 
     newCenter.y += point.y - originalCenter.y; 

     // Update view center 
     view.center = newCenter 
    } 
    else if gesture.state == .ended { 
     ... 
    } 
}