2011-11-23 28 views
8

Tôi có một bó gồm UIButton s trong một số UIView trong một số UIScrollView. Tôi đang cố gắng thêm trình nhận dạng nhấn vào chế độ xem cuộn. Trình nhận dạng chạm sẽ kích hoạt nhưng giờ đây không có nút nào của tôi hoạt động.UITapRecognizer iOS5 cho UIScrollView gây trở ngại cho các nút. Làm thế nào để khắc phục?

Tôi biết rằng trong iOS5, UIScrollView bằng cách nào đó có thể truyền sự kiện chạm xuống đến hệ thống phân cấp điều khiển sau khi hoàn thành nó. Bất cứ ai cũng có thể giúp tôi tìm ra cách để làm điều này?

Trả lời

15

Đặt thuộc tính UIGestureRecognizercancelsTouchesInView thành NO.

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                          action:@selector(singleTap:)]; 
singleTapGestureRecognizer.numberOfTapsRequired = 1; 
singleTapGestureRecognizer.enabled = YES; 
singleTapGestureRecognizer.cancelsTouchesInView = NO; 
[tapableView addGestureRecognizer:singleTapGestureRecognizer]; 
[singleTapGestureRecognizer release]; 

Từ UIGestureRecognizer Class Reference

Một giá trị Boolean ảnh hưởng cho dù chạm được giao cho một cái nhìn khi một cử chỉ được công nhận.

Khi khách sạn này là YES (mặc định) và thu nhận ra cử chỉ của nó, là những nét cử chỉ đó có đang chờ giải quyết không được chuyển giao cho các quan điểm và phân phối trước chạm được hủy thông qua một touchesCancelled: withEvent: Thông điệp được gửi đến chế độ xem. Nếu trình nhận dạng cử chỉ không nhận ra cử chỉ của nó hoặc nếu giá trị của thuộc tính này là NO, chế độ xem sẽ nhận được tất cả các lần chạm trong chuỗi nhiều lần chạm .

+1

chính xác những gì tôi cần, cảm ơn vì bài trả lời nhanh chóng! :) –

+0

Điều này khiến cả nút và trình nhận dạng cử chỉ kích hoạt ... – hfossli

+0

@hfossli đúng. – Till

0

Bạn cũng có thể sử dụng phương pháp gestureRecognizer:shouldReceiveTouch: của UIGestureRecognizerDelegate, mà là tài liệu here, để thực hiện được điều tương tự. Ví dụ, nó mang lại sự linh hoạt hơn một chút, nếu bạn muốn hủy bỏ một số lần chạm nhất định, nhưng không phải là những thứ khác. Dưới đây là một ví dụ,

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[UIButton class]]) return NO; 

    return YES; 
} 
+0

Điều đó thực sự không giống nhau. Khi trả về NO, bộ nhận dạng cử chỉ không xử lý được cảm ứng. Khi quay trở lại YES, UIView không xử lý các liên lạc. cancelsTouchesInView được đặt thành NO có nghĩa là cả hai, trình nhận dạng cử chỉ VÀ chế độ xem nhận được liên lạc. – Till

+0

Bạn chính xác. Nếu bạn muốn hoàn thành cả hai khả năng bạn có thể xử lý sự kiện chạm ở đây * trước khi * trả về KHÔNG. – john

2

Đối với tôi một combo các câu trả lời ở trên làm việc

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userDidTap:)]; 
tapRecognizer.cancelsTouchesInView = YES; 
tapRecognizer.delegate = self; 
[tapRecognizer requireGestureRecognizersToFail:self.scrollView.gestureRecognizers]; 
[self.view addGestureRecognizer:tapRecognizer]; 

-

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[UIButton class]] || [touch.view isKindOfClass:[UIButton class]]) 
    { 
     return NO; 
    } 
    return YES; 
} 
+0

Điều này sẽ làm cho trình nhận dạng cử chỉ không thành công trên nút - không chắc chắn cách điều này tương quan với câu hỏi. – Till

+0

Có, nó sẽ. Trong trường hợp của tôi đó là hành vi mong muốn. Câu hỏi không rõ ràng về điểm này đối với sự hiểu biết của tôi. – hfossli

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