2013-10-13 19 views
9

Tôi nhận được các báo cáo không liên tục từ người dùng trên iOS 7 cho biết rằng UIPanGestureRecognizer ngừng hoạt động trên các chế độ xem nhất định mỗi lần. Chúng được cho là có khả năng vuốt một chế độ xem sang phải/trái, nhưng nó chỉ bị hỏng và không hoạt động vì một số lý do không xác định. Buộc thoát ứng dụng và khởi chạy lại nó sẽ khắc phục sự cố.UIPanGestureRecognizer đôi khi không hoạt động trên iOS 7

Vấn đề này chưa từng xảy ra trên iOS 6. Và tôi không có bất kỳ mã mà vô hiệu hóa nhận dạng cử chỉ bất cứ lúc nào bên cạnh những gestureRecognizerShouldBegin đại biểu rằng lực lượng cử chỉ để chỉ nhận chảo ngang:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer { 

    if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]]) { 

     CGPoint translation = [gestureRecognizer translationInView:[self superview]]; 

     if (fabsf(translation.x) > fabsf(translation.y)) { 

      if (translation.x > 0) 
       return YES; 
     } 
    } 
    return NO; 
} 

Did bất cứ điều gì thay đổi trong UIPanGestureRecognizer (hoặc chỉ là đồng bằng UIGestureRecognizer) có thể gây ra vấn đề này?

+0

Bạn đã xác minh rằng kiểm tra 'x> y' không gây ra lối thoát sớm trong thời gian trình nhận dạng cử chỉ có vẻ không hoạt động? – RyanR

+0

Rất tiếc, tôi thậm chí không thể tạo lại lỗi trên bất kỳ thiết bị nào của mình, nhưng tôi đã nhận được đủ báo cáo từ người dùng rằng tôi biết không chỉ một người dùng không biết họ đang làm gì. – bmueller

+1

Tôi đã có nó xảy ra một vài lần bây giờ. 'GestureRecognizerShouldBegin' được gọi và trả về' YES' một cách chính xác, nhưng phương thức mà tôi gán cho 'UIPanGestureRecognizer' không được gọi. Vì vậy, nó nhận ra cử chỉ nhưng không gọi phương thức ... – bmueller

Trả lời

12

Tôi nghĩ rằng cuối cùng tôi đã giải quyết được vấn đề này. Dường như iOS 7 xử lý các cử chỉ trong các bản phân tích khác với các phiên bản iOS 6 trở về trước. Để xử lý việc này, Apple đã triển khai một đại biểu mới:

(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 

Nếu bạn trả lại CÓ, điều đó sẽ làm cho trình nhận dạng cử chỉ của bạn hoạt động. Tôi đã thực hiện nó và không có bất kỳ vấn đề nào cho đến nay (mặc dù thừa nhận đây là một lỗi hiếm hoi mà tôi không bao giờ có thể tái tạo một cách đáng tin cậy, vì vậy có thể nó chưa tái phát).

Để biết thêm thông tin, hãy xem https://stackoverflow.com/a/19892166/1593765.

+1

Bắt tuyệt vời! Cảm ơn bạn! :-) – kernix

+0

Tôi có lỗi này quá với UIPanGestureRecognizer, hướng không làm việc trong trái/phải đại biểu trở lại luôn luôn NO, trong một số hình ảnh loại, tôi không thể tìm thấy giải thích (nhưng khi tôi thay đổi phương pháp đại biểu về câu trả lời này tất cả các công trình. ! –

+0

Mẹo tuyệt vời! Hãy dành một vài giờ đồng hồ này! –

0

Tại sao bạn trả về NO trong trình nhận dạng cử chỉ chỉ vì trên gestureRecognizerShouldBegin: chuyển động chỉ là dọc? Vì cử chỉ của nó được thực hiện bởi người dùng bằng ngón tay của mình (và không được thực hiện bởi một máy), sẽ luôn có một số ngẫu nhiên trong chuyển động của nó do thiếu chính xác di chuyển ngón tay. gestureRecognizerShouldBegin: sẽ được gọi ngay sau khi người dùng chạm vào màn hình và bản dịch bạn nhận được có thể chỉ là một vài pixel. Trình nhận dạng của bạn sẽ không thành công nếu người dùng nghĩa là khi đặt ngón tay lên màn hình di chuyển nó lên 2 pixel, ngay cả khi sau đó di chuyển nó 200 pixel sang phải. Điều này sẽ không khiến trình nhận dạng cử chỉ bị tắt vĩnh viễn nhưng bạn cũng nên xem xét nó vì nó có thể gây nhầm lẫn cho người dùng khi cử chỉ của họ không được công nhận vì dường như không có lý do gì.

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