2010-07-20 41 views
7

Tôi đang sử dụng lớp con tùy chỉnh UIGestureRecognizer để theo dõi cử chỉ trên lớp InfoView của mình. Lớp InfoView là chế độ xem phụ của lớp phụ UITableViewCell được gọi là InfoCell.UIGestureBộ lọc ngăn chặn nhận dạng bảng di chuyển

Tôi đã thêm trình nhận dạng cử chỉ vào chế độ xem gốc của mình (chế độ xem gốc của mọi thứ khác trên màn hình, vì mục đích của trình nhận dạng cử chỉ tùy chỉnh của tôi là cho phép kéo InfoCell lượt xem giữa các bảng). Bây giờ, tất cả mọi thứ hoạt động như nó nên ngoại trừ một điều. Tôi đang sử dụng đoạn mã sau vào UIGestureRecognizer lớp con của tôi để phát hiện chạm trên InfoView xem:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UIView *touchView = [[touches anyObject] view]; 
    if ([touchView isKindOfClass:[InfoView class]]) { 
     // Do stuff 
    } 

Vấn đề ở đây là rằng chạm vào đối tượng InfoView đang bị chặn, do đó họ không được chuyển tiếp đến UITableView chứa InfoCell, là chế độ xem gốc của số InfoView. Điều này có nghĩa là tôi không còn có thể cuộn chế độ xem bảng bằng cách kéo trên chế độ xem InfoView, đây là vấn đề vì InfoView bao gồm toàn bộ InfoCell.

Có cách nào tôi có thể chuyển tiếp các lần chạm vào chế độ xem bảng để có thể cuộn không? Tôi đã thử một loạt các thứ đã:

[super touchesBegan:touches withEvent:event];

[touchView.superview.superview touchesBegan:touches withEvent:event]; (touchView.superview.superview được một tham chiếu đến mẹ UITableView)

Nhưng không có gì đã làm việc cho đến nay. Ngoài ra, các cancelsTouchesInView thích hợp của tôi UIGestureRecognizer được thiết lập để NO, do đó, không can thiệp với các chạm.

Trợ giúp được đánh giá cao. Cảm ơn!

Trả lời

3

Tôi có một dòng trong phương pháp touchesBegan đặt thuộc tính state của trình nhận dạng cử chỉ là UIGestureRecognizerStateBegan. Loại bỏ dòng này dường như để khắc phục sự cố.

9

UIGestureRecognizer có thuộc tính "cancelsTouchesInView" được đặt thành YES theo mặc định. Điều này có nghĩa là các chạm trong UIView sẽ bị hủy khi một cử chỉ được nhận dạng. Hãy thử đặt nó thành NO để cho phép UIScrollView nhận các sự kiện chạm tiếp theo.

24

Kiểm tra các phương pháp UIGestureRecognizerDelegate: - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

Nếu đây trả YES nó sẽ ngăn chặn nhận dạng cử chỉ của bạn từ dậm trên một trong đó UIScrollView được sử dụng để phát hiện di chuyển.

+0

này điều cố định đối với tôi khi tôi đã có cùng một vấn đề, nhờ –

+0

Tôi đã đập đầu tôi vào tường trên thế này. Cảm ơn ! : D – Legolas

3

Bạn có thể thử thêm thông báo này

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 
    if ([gestureRecognizer class] == [UIPanGestureRecognizer class]) { 
     UIPanGestureRecognizer *panGestureRec = (UIPanGestureRecognizer *)gestureRecognizer; 
     CGPoint point = [panGestureRec velocityInView:self]; 
     if (fabsf(point.x) > fabsf(point.y)) { 
      return YES; 
     } 
    } 
    return NO; 
} 
+0

đây là câu trả lời đúng, ngăn chặn panGesture bắt đầu nếu cử chỉ là dọc. – Vassily

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