2012-01-18 24 views
22

Tôi có một số UIView trong đó tôi đã thêm UITapGestureRecognizer. Bên trong quan điểm đó tôi cũng có một subview, trong đó về cơ bản là một số loại UITableView. Câu hỏi đặt ra là tại sao không phải là UITableView nhận ra các vòi nước trên một hàng, thay vào đó nó đi đến xử lý của bộ nhận dạng cử chỉ của tất cả các thời gian. Tại sao điều này, và làm cách nào để giải quyết vấn đề này? Nếu tôi đặt số lượng vòi thành 2, thì nó hoạt động tốt. Bất kỳ ý tưởng về cách giải quyết này? Về cơ bản nó không gọi là didSelectRowAtIndexPath.Xung đột UITapGestureRecognizer trong UIView và cho UITableView

Trả lời

54

Đặt cancelsTouchesInView trình nhận dạng của bạn thành NO. Nếu không, nó "tiêu thụ" các liên lạc cho chính nó, và không vượt qua nó vào xem bảng. Đó là lý do tại sao sự kiện lựa chọn không bao giờ xảy ra.

+4

[Đặt giá trị này thành 'NO' chỉ thị trình nhận dạng phân phối tất cả các lần chạm đến khung nhìn cơ bản, ngay cả khi nó đã nhận ra chuỗi.] (Http://developer.apple.com/library/IOs/#documentation/ UIKit/Tham khảo/UIGestureRecognizer_Class/Tham khảo/Tham khảo.html) – dasblinkenlight

+1

mã ví dụ 'longPressGestureRecognizer.cancelsTouchesInView = NO;' (cảm ơn bạn dasblinkenlight) – tmr

+0

@ dasblinkenlight vẫn không hoạt động cho tôi, tôi không thể thực hiện các sự kiện chạm trên ô xem bảng của mình, tôi không thể chọn các mục từ ô xem bảng, tôi đã sử dụng 'func tableView (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 'nhưng các mục không nhận được lựa chọn –

26

Nếu bạn muốn cả bạn UITableViewUITapGestureRecognizer của bạn để nhận các sự kiện liên lạc, sau đó có các cancelsTouchesInView = NO sẽ làm việc. Nếu bạn muốn trình nhận dạng cử chỉ chạm không nhận được các sự kiện chạm có nghĩa là cho chế độ xem bảng, nó hơi dễ dàng hơn nhưng rất có thể thực hiện được.

Về cơ bản khi bạn đang tạo trình nhận dạng cử chỉ, bạn đặt mình là đại biểu của nó. Sau đó, bạn triển khai phương thức ủy quyền gestureRecognizer:shouldReceiveTouch:. Việc triển khai cơ bản có thể trông như thế này.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 
    UITableView *tableView = self.tableView; 
    CGPoint touchPoint = [touch locationInView:tableView]; 
    return ![tableView hitTest:touchPoint withEvent:nil]; 
} 

Về cơ bản phương pháp này (như thực hiện) yêu cầu các tableView nếu vị trí của cảm ứng này nằm trong thẩm quyền của tableView, và nếu có, nó sẽ ngăn chặn việc nhận dạng cử chỉ từ khi nhận được liên lạc ... cho phép tableView để nhận được liên lạc.

+1

Chúng ta không thể làm điều này đơn giản hơn nhiều bằng cách thay đổi dòng 3 và 4 thành:' CGRect frame = self.tableView.frame; CGRectContainsPoint (khung, vị trí); '? – Aufwind

+0

@Aufwind Cảm ơn bạn đã chỉ ra mã tính toán quá phức tạp của mình. Tôi phải vội vã trả lời câu hỏi này quá nhiều. 'CGRectContainsPoint()' chắc chắn là một cách tốt hơn để xử lý phép tính này sau đó ban đầu tôi đã chọn. Tuy nhiên tôi đã chỉnh sửa câu trả lời của mình để sử dụng 'hitTest: withEvent:'. Đó sẽ là phương pháp ưa thích của tôi vì một vài lý do. Một trong số đó sẽ là một cái nhìn không định hình. Nếu một khung nhìn được trình bày dưới dạng hình dạng bất thường (ví dụ một vòng tròn chỉ xử lý các điểm chạm trong vùng vòng tròn). Trường hợp này sẽ không được xử lý đúng bởi các tính toán thủ công mà tôi đã thực hiện. Cảm ơn một lần nữa. – NJones

+0

Bạn được chào đón. :-) – Aufwind

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