2013-06-02 29 views
27

Tôi có một UIScrollView mà tôi đã thêm một recognizer tap cử chỉ duy nhất để hiển thị/ẩn một số lớp phủ UI sử dụng:scrollview cử chỉ recognizer ăn tất cả các sự kiện liên lạc

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
[scrollView addGestureRecognizer:singleTap]; 

và:

- (void)handleTap:(UITapGestureRecognizer *)sender { 
    // report click to UI changer 
} 

tôi đã thêm an easy table view ở dưới cùng của UIScrollView. Tất cả mọi thứ hoạt động đúng (di chuyển cả theo chiều ngang và chiều dọc) nhưng vấn đề là các vòi chỉ được nhận dạng bởi bộ nhận dạng cử chỉ (ở trên), nhưng không phải bởi chế độ xem bảng dễ dàng. Nếu tôi xóa Dòng đăng ký trình nghe cử chỉ, mọi thứ hoạt động tốt, thông báo chế độ xem bảng sẽ tự động chạm vào.

Giống như chức năng nhận dạng cử chỉ "ăn" các sự kiện nhấn trên màn hình bảng và không truyền bá chúng xuống dưới.

Bất kỳ trợ giúp nào được đánh giá cao

Trả lời

61

Điều này sẽ giải quyết được sự cố của bạn.
Detect touch event on UIScrollView AND on UIView's components [which is placed inside UIScrollView]
Ý tưởng là cho trình nhận dạng cử chỉ không nuốt các sự kiện chạm. Để làm điều này, bạn cần phải đặt thuộc tính cancelsTouchesInView của singleTap thành NO, theo mặc định là YES.

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
singleTap.cancelsTouchesInView = NO; 
[scrollView addGestureRecognizer:singleTap]; 
+1

Điều đó đã làm điều đó :) –

+2

Tôi có vấn đề tương tự ([câu hỏi của tôi] (http://stackoverflow.com/questions/33105678/in-ios-button-tapping-not-fired-when-keyboard-is- có thể nhìn thấy)) nhưng giải pháp không hoạt động đối với tôi. Đôi khi sự kiện được kích hoạt, đôi khi không. – new2ios

+1

là giải pháp cuối cùng.thanks zambrey –

5

Bạn có thể đặt đối tượng nào sẽ được bao gồm/loại trừ khi chạm.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {    
    if (touch.view == [self view]) { 
     return YES; 
    } 
    return NO; 
} 
5

Tôi nghĩ lý do là User Interaction Enabled được thiết lập để false cho UIImageView. Bạn nên thiết lập nó là true để cho phép khai thác trong đó

2

Cảm ơn @zambrey

Swift 2.2 + Version:

scrollView.delegate = self 

let allowMultipleTouches = UITapGestureRecognizer(target: self, action: #selector(genderPressed)) 
allowMultipleTouches.numberOfTapsRequired = 1 
allowMultipleTouches.cancelsTouchesInView = false 

scrollView.addGestureRecognizer(allowMultipleTouches) 

Nếu xem di chuyển của bạn là trong Storyboard, đừng quên ghim Ổ cắm trong bộ điều khiển chế độ xem. Trong ví dụ này, scrollView là Cửa hàng của UIScrollView.

1

TapGestures for me. Các swipe mặt khác, tôi đã phải vô hiệu hóa di chuyển và nó làm việc.

 swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:))) 
    swipeLeftGesture.direction = .left 
    scrollView.addGestureRecognizer(swipeLeftGesture) 

    swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:))) 
    scrollView.addGestureRecognizer(swipeRightGesture) 

    scrollView.isScrollEnabled = false 
5

Swift 3,0

let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))) 
singleTap.cancelsTouchesInView = false 
singleTap.numberOfTapsRequired = 1 
scrollView.addGestureRecognizer(singleTap) 

Và phương pháp chọn như thế nào.

func handleTap(_ recognizer: UITapGestureRecognizer) { 
    // Perform operation 
} 
+0

Giải pháp hoàn hảo! –

1

Bạn có thể chụp bất kỳ loại cử chỉ nào trong UIscrollView. Hãy chắc chắn rằng bạn cũng xử lý một số thuộc tính mặc định cũng như đặt thuộc tính cancelsTouchesInView thành false, nó là true theo mặc định. Cũng cung cấp một số thẻ cho các chế độ xem phụ của bạn để phân biệt trong các bộ chọn. & cũng cho phép tương tác Người dùng của họ thành true.

let tap = UITapGestureRecognizer (mục tiêu: tự, hành động:

selector (didTapByUser (_ :)))

1

này đã làm việc cho tôi trong Swift 3/Xcode 8

self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **) 
    self.scrollView.canCancelContentTouches = false 

Chúc may mắn!

+0

Thay vì để lại thông tin này trong một nhận xét, vui lòng [sửa] câu trả lời của bạn và thêm nó trực tiếp vào đó, sau đó xóa nhận xét. Bạn cũng có thể nắm bắt cơ hội để sửa chữa thụt lề (định dạng mã với Markdown yêu cầu 4 dấu cách, nhưng bạn có 8 dấu cách, dẫn đến mức thụt lề không cần thiết thêm). Cảm ơn bạn! –

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