2011-11-25 10 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"); 
} 

moje pytanie:iOS Jak sprawić, aby funkcja UITextView wykryła jedno stuknięcie?

chcę symulować dwa krany, gdy dotykając raz na UITextView, który jest TextView w tym kodzie. Ale nie dostaję NSLog od jednego i dwóch dotknięć, gdy dotknę raz lub dwa razy w widoku tekstowym, tylko poza nim. Co powinienem zrobić, aby działało?

+0

Przede wszystkim ten kod musiałby być w podklasie zwyczaj UITextView do pracy, i prawdopodobnie zakłócać normalnej pracy. Po drugie, co masz na myśli przez "Chcę symulować dwa dotknięcia, gdy dotykając raz na UITextView", mam na myśli w jakim celu? – NJones

+0

@NJones Chcę dać użytkownikom opcję wyboru jednego lub dwóch dotknięć dla określonej funkcji. Chcę symulować dwa dotknięcia, aby uzyskać zaznaczony tekst i zrobić tylko jedno kliknięcie dla użytkowników, jeśli wybiorą tę opcję. Czy możliwe jest wymuszenie dwóch stuknięć przy jednokrotnym stuknięciu w UITextView? Rozwiązanie bensnider działa idealnie. Ale jak symulować dwa zawory? – wagashi

Odpowiedz

16

Prawdopodobnie użyłbym dwóch gesture recognizers tutaj.

//...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]; 

I selektory będzie tylko jak:

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

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

Twoje rozwiązanie działa wyczekująco idealnie. Jednak naprawdę chcę zasymulować dwa dotknięcia, gdy stukam raz, aby uzyskać zaznaczony tekst. – wagashi

+0

Co masz na myśli, zdobyć wybrany tekst? – NJones

+0

Następne pytanie brzmi: jak to zrobić, jednocześnie pozwalając, aby widok tekstu wykrywał kliknięcia w linki? –

1

miałem ten sam problem i inne odpowiedzi nie działa dla mnie. Tak właśnie zrobiłem.

Dołączyłem gest, jak sugeruje inna odpowiedź. Następnie upewniłem się, że wybrano delegowaną metodę selekcji. Próbowałem po prostu wybrać komórkę, ale to nie wywołało metody delegatów. Uważam, że tylko interakcje użytkownika powodują wywołanie metody delegata, więc ten kod naśladuje to zachowanie.

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

I napotkał podobny problem, gdzie chciałem uchwycić kranu na TextView bez edytowania tekstu bazowego.

Ta odpowiedź jest dla Swift 3.0.

Dla mojego rozwiązania zaimplementowałem metodę textView delegate textViewShouldBeginEditing i zwróciłem false dla wartości. To pozwala mi przechwytywać krany na textView bez dodatkowego obciążenia.

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

     return false 
    } 
} 

Pamiętaj, aby przydzielić textView, aby użyć delegata w klasie ViewController.

Powiązane problemy