2013-08-22 10 views
7

Ho un UIPanGuestureRecognizer aggiunto l'intera vista utilizzando questo codice:Get scorri per eliminare l'UITableView a lavorare con UIPanGestureRecognizer

UIPanGestureRecognizer *pgr = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)]; 
[[self view] addGestureRecognizer:pgr]; 

All'interno della vista principale Ho un UITableView che ha questo codice per attivare il colpo a eliminare caratteristica:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"RUNNING2"); 
    return UITableViewCellEditingStyleDelete; 
} 

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row >= _firstEditableCell && _firstEditableCell != -1) 
     NSLog(@"RUNNING1"); 
     return YES; 
    else 
     return NO; 
} 

Solo RUNNING1 viene stampato il registro e il pulsante Elimina non si presenta. Credo che la ragione di questo sia UIPanGestureRecognizer, ma non ne sono sicuro. Se questo è corretto come dovrei andare a risolvere questo. Se ciò non è corretto, fornire la causa e correggere. Grazie.

+0

Avete impostare la classe di essere delegato del visualizzazione della tabella? – rdelmar

+0

@rdelmar Sì. Inoltre, non penso che RUNNING1 sarebbe stampato se non lo facessi. Ma grazie per aver provato. – carloabelli

+2

canEditRorAtIndexPath: è un metodo di origine dati, non un metodo delegato, pertanto verrà eseguito se non è stato impostato il delegato. – rdelmar

risposta

13

Dal document:

Se un sistema di riconoscimento gesto riconosce il suo gesto, le restanti tocchi per la visualizzazione vengono cancellati.

tuo UIPanGestureRecognizer riconosce il gesto di scorrimento prima, in modo che il UITableView non riceve più tocchi.

Per rendere la visualizzazione tabella riceve contatto contemporaneamente con il sistema di riconoscimento gesto, aggiungere questo al delegato del riconoscitore gesto:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 
+0

Esattamente quello che stavo cercando. Funziona magnificamente. Grazie! – carloabelli

+0

Perfetto ... Funziona alla grande ... – davidOhara

0

Se si utilizza UIPanGuestureRecognizer per esempio per mostrare menu laterale è possibile vedere alcuni effetti collaterali indesiderati quando si restituisce SÌ in tutti i casi come proposto nella risposta accettata. Ad esempio, il menu laterale si apre quando scorri verso l'alto/il basso la vista tabella (con un'ulteriore minima direzione sinistra/destra) o il pulsante Elimina si comporta in modo strano quando apri il menu laterale. Quello che potresti voler fare per prevenire questi effetti collaterali è di consentire solo gesti orizzontali simultanei. Questo farà sì che il pulsante di cancellazione funzioni correttamente, ma allo stesso tempo altri movimenti indesiderati verranno bloccati quando si scorre il menu.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) 
    { 
     UIPanGestureRecognizer *panGesture = (UIPanGestureRecognizer *)otherGestureRecognizer; 
     CGPoint velocity = [panGesture velocityInView:panGesture.view]; 
     if (ABS(velocity.x) > ABS(velocity.y)) 
      return YES; 
    } 
    return NO; 
} 

o in Swift:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    guard let panRecognizer = otherGestureRecognizer as? UIPanGestureRecognizer else { 
     return false 
    } 
    let velocity = panRecognizer.velocity(in: panRecognizer.view) 
    if (abs(velocity.x) > abs(velocity.y)) { 
     return true 
    } 
    return false 
}