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

TÔI HỎI:ios Làm cách nào để UITextView phát hiện một lần nhấn?

Tôi muốn để mô phỏng hai vòi khi khai thác một lần vào một UITextView, đó là TextView trong mã này. Nhưng tôi không nhận được NSLog từ một và hai vòi khi tôi chạm một lần hoặc hai lần trên textview, chỉ bên ngoài nó. Tôi nên làm gì để nó hoạt động?

+0

Trước hết mã này sẽ phải nằm trong lớp con UITextView tùy chỉnh để hoạt động và có thể ảnh hưởng đến hoạt động bình thường. Thứ hai, ý của bạn là gì "Tôi muốn mô phỏng hai lần nhấn khi chạm một lần vào một UITextView", ý tôi là vì mục đích gì? – NJones

+0

@NJones Tôi muốn cung cấp cho người dùng tùy chọn để chọn giữa một hoặc hai lần nhấn cho một chức năng nhất định. Tôi muốn mô phỏng hai lần nhấn để lấy văn bản đã chọn và chỉ tạo một lần nhấn cho người dùng nếu họ chọn tùy chọn này. Có thể ép buộc hai lần nhấn khi chạm một lần vào UITextView không? giải pháp của bensnider hoạt động hoàn hảo. Nhưng làm thế nào để mô phỏng hai vòi? – wagashi

Trả lời

16

Có lẽ tôi sẽ sử dụng hai gesture recognizers tại đây.

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

Và selectors sẽ chỉ được như:

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

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

Giải pháp của bạn hoạt động hoàn hảo. Tuy nhiên, tôi thực sự muốn mô phỏng hai lần nhấn khi chạm một lần để nhận văn bản đã chọn. – wagashi

+0

Bạn có ý gì khi nhận được văn bản đã chọn? – NJones

+0

Câu hỏi tiếp theo là, cách thực hiện điều này trong khi cho phép chế độ xem văn bản phát hiện các vòi trên liên kết? –

1

tôi đã cùng một vấn đề và các câu trả lời khác không làm việc cho tôi. Vì vậy, đây là những gì tôi đã làm.

Tôi đã đính kèm cử chỉ như một câu trả lời khác được đề xuất. Sau đó, tôi chắc chắn rằng phương pháp đại biểu để lựa chọn được gọi. Tôi đã thử chỉ đơn giản là chọn các tế bào nhưng điều đó đã không cháy phương pháp đại biểu. Tôi tin rằng chỉ những tương tác của người dùng mới khiến phương thức ủy nhiệm được gọi, vì vậy mã này bắt chước hành vi đó.

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

tôi gặp phải một vấn đề tương tự mà tôi muốn chụp một vòi nước trên TextView mà không chỉnh sửa văn bản cơ bản.

Câu trả lời này là dành cho Swift 3.0.

Đối với giải pháp của mình, tôi đã triển khai phương thức ủy nhiệm textView textViewShouldBeginChỉnh sửa và trả về giá trị false. Điều này cho phép tôi chụp các vòi trên textView mà không cần thêm bất kỳ chi phí nào.

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

     return false 
    } 
} 

Chỉ cần đảm bảo gán textView để sử dụng đại biểu trong lớp ViewController của bạn.

Các vấn đề liên quan