2011-11-25 14 views
10
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    NSLog(@"touchesBegan"); 

    //test 
    UITouch *touch = [event allTouches] anyObject]; 
    if ([touch tapCount] == 2) { 
     NSLog (@"tapcount 2"); 
     [self.textview becomeFirstResponder]; 

    } 

    else if ([touch tapCount] == 1) { 
     NSLog (@"tapcount 1"); 
     [self.textview becomeFirstResponder]; 
     [self.view performSelector:@selector(select:)]; 


    } 

} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesBegan:touches withEvent:event]; 
    NSLog(@"touchesMoved"); 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    NSLog(@"****touchesEnded"); 
    [self.nextResponder touchesEnded: touches withEvent:event]; 
    NSLog(@"****touchesEnded"); 
    [super touchesEnded:touches withEvent:event]; 
    NSLog(@"****touchesEnded"); 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesCancelled:touches withEvent:event]; 
    NSLog(@"touchesCancelled"); 
} 

MIA DOMANDA:ios Come rendere UITextView rilevare un tocco?

voglio simulare due rubinetti quando si tocca una volta su un UITextView, che è TextView in questo codice. Ma non ottengo NSLog da uno e due tocchi quando tocco una o due volte su textview, solo al di fuori di esso. Cosa dovrei fare per farlo funzionare?

+0

Prima di tutto questo codice dovrebbe essere in una sottoclasse UITextView personalizzata per funzionare e probabilmente interferirebbe con il normale funzionamento. In secondo luogo, cosa intendi con "Voglio simulare due tocchi quando tocchi una volta su un UITextView", intendo per quale scopo? – NJones

+0

@NJones Desidero dare agli utenti un'opzione per scegliere tra uno o due tocchi per una determinata funzione. Voglio simulare due tocchi per ottenere il testo selezionato e renderlo un solo tocco per gli utenti se scelgono questa opzione. È possibile forzare due tocchi quando si tocca una volta su UITextView? la soluzione di bensnider funziona perfettamente. Ma come simulare due tap? – wagashi

risposta

16

Probabilmente userei due gesture recognizers qui.

//...some stuff above here probably in you're controllers viewDidLoad 

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapRecognized:)]; 
singleTap.numberOfTapsRequired = 1; 
[someTextView addGestureRecognizer:singleTap]; 
[singleTap release]; 

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapRecognized:)]; 
doubleTap.numberOfTapsRequired = 2; 
[someTextView addGestureRecognizer:doubleTap]; 
[doubleTap release]; 

E i selettori sarebbe solo essere come:

- (void)singleTapRecognized:(UIGestureRecognizer *)gestureRecognizer { 
    NSLog(@"single tap"); 
    // ...etc 
} 

- (void)doubleTapRecognized:(UIGestureRecognizer *)gestureRecognizer { 
    NSLog(@"double tap"); 
    // ...etc 
} 
+0

La tua soluzione funziona in maniera perfetta. Tuttavia, voglio veramente simulare due tocchi quando tocchi una volta per ottenere il testo selezionato. – wagashi

+0

Cosa intendi con, ottieni il testo selezionato? – NJones

+0

La prossima domanda è, come fare questo consentendo al textview di rilevare i tocchi sui collegamenti? –

1

Ho avuto lo stesso problema e le altre risposte non ha funzionato per me. Quindi questo è quello che ho fatto.

Ho attaccato il gesto come suggerito da un'altra risposta. Poi mi sono assicurato che venisse chiamato il metodo delegato per la selezione. Ho provato semplicemente a selezionare la cella ma non ha attivato il metodo delegato. Credo che solo le interazioni utente causino il richiamo del metodo delegato, quindi questo codice simula tale comportamento.

https://gist.github.com/brennanMKE/e89bf7a28d96812d6a22

@implementation TappableTextView 

- (instancetype)init { 
    self = [super init]; 
    if (self) { 
     [self setup]; 
    } 
    return self; 
} 

- (instancetype)initWithCoder:(NSCoder *)coder { 
    self = [super initWithCoder:coder]; 
    if (self) { 
     [self setup]; 
    } 
    return self; 
} 

- (instancetype)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self setup]; 
    } 
    return self; 
} 

- (void)setup { 
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapRecognized:)]; 
    singleTap.numberOfTapsRequired = 1; 
    [self addGestureRecognizer:singleTap]; 
} 

- (void)singleTapRecognized:(id)sender { 
    UIView *superview = self.superview; 

    UICollectionViewCell *cell = nil; 
    NSIndexPath *indexPath = nil; 

    while (superview) { 
     if ([superview isKindOfClass:[UICollectionViewCell class]]) { 
      cell = (UICollectionViewCell *)superview; 
     } 

     if ([superview isKindOfClass:[UICollectionView class]] && cell) { 
      UICollectionView *collectionView = (UICollectionView *)superview; 
      indexPath = [collectionView indexPathForCell:cell]; 
      NSAssert(collectionView.delegate, @"Delegate must be defined"); 
      NSAssert([collectionView.delegate respondsToSelector:@selector(collectionView:didSelectItemAtIndexPath:)], @"Selection must be supported"); 
      if (indexPath && [collectionView.delegate respondsToSelector:@selector(collectionView:didSelectItemAtIndexPath:)]) { 
       [collectionView.delegate collectionView:collectionView didSelectItemAtIndexPath:indexPath]; 
      } 

      return; 
     } 

     superview = superview.superview; 
    } 
} 

@end 
0

ho incontrato un problema simile in cui ho voluto catturare un tap su una textView senza modificare il testo sottostante.

Questa risposta è per Swift 3.0.

Per la mia soluzione, ho implementato il metodo textView text delegView textViewShouldBeginEditing e restituito false per il valore. Questo mi consente di catturare i tocchi sulla TextView senza alcun sovraccarico aggiuntivo.

extension ViewController: UITextViewDelegate { 
    func textViewShouldBeginEditing(_ textView: UITextView) -> Bool { 
     // Do something 

     return false 
    } 
} 

Accertarsi di assegnare il valore textView per utilizzare il delegato nella classe ViewController.

Problemi correlati