33

Tôi có di chuyển dọc UIScrollView. Tôi cũng muốn xử lý chảo ngang trên nó, trong khi cho phép các hành vi di chuyển dọc mặc định. Tôi đã đặt UIView trong suốt qua chế độ xem cuộn và thêm trình nhận dạng cử chỉ di chuyển vào đó. Bằng cách này tôi có thể nhận được các chảo chỉ tốt, nhưng sau đó xem di chuyển không nhận được bất kỳ cử chỉ.Ngăn chặn cử chỉ di chuyển qua UIScrollView ngắt cuộn

tôi đã thực hiện các UIPanGestureRecognizerDelegate phương pháp sau đây, hy vọng sẽ hạn chế nhận dạng cử chỉ của tôi để chỉ chảo ngang, nhưng điều đó không giúp:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer 
{ 
    // Only accept horizontal pans here. 
    // Leave the vertical pans for scrolling the content. 
    CGPoint translation = [gestureRecognizer translationInView:self.view]; 
    BOOL isHorizontalPan = (fabsf(translation.x) > fabsf(translation.y)); 
    return isHorizontalPan; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return (otherGestureRecognizer == _scrollView.panGestureRecognizer); 
} 
+1

Các bạn đã thử '[panGesture setCancelsTouchesInView: NO];'? Chỉ cần trả về YES trong 'shouldRecognizeSimultaneouslyWithGestureRecognizer' có thể giúp bạn tìm ra vấn đề ở đâu. –

+0

Chỉ cần thử nó, không có sự khác biệt. – Macondo2Seattle

Trả lời

33

OK, I figured it out. Tôi cần phải làm 2 việc để thực hiện công việc này:

1) Đính kèm trình nhận dạng pan của chính tôi vào chính chế độ xem cuộn, không phải chế độ xem khác trên đầu trang.

2) Phương pháp UIGestureRecognizerDelegate này ngăn chặn hành vi ngốc nghếch xảy ra khi cả chế độ xem cuộn mặc định và của tôi được gọi đồng thời.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 
+2

hành vi mặc định của shouldRecognizeSimultaneouslyWithGestureRecognizer là trả về NO, do đó, việc thêm không cần thiết –

+4

thay đổi giá trị trả về thành 'YES' và nó hoạt động tốt. –

11

tôi đã cùng một vấn đề để giải quyết và tôi đã làm điều này:

1) Đính kèm recognizer chảo của riêng tôi để xem di chuyển.

2) Return YES trên: - gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:

này sẽ cho phép cả những cử chỉ để làm việc. Điều đó có nghĩa là trên cuộn dọc, cả đại biểu panGesture của bạn và đại biểu scrollView sẽ bị sa thải. Nếu đó là một cuộn ngang, nó sẽ chỉ gọi đại biểu panGesture của bạn.

3) trong panGesture delegate, phát hiện xem đó có phải là cuộn ngang hay không, nếu không, bỏ qua.

+1

Điều này hoàn toàn giống với ý kiến ​​của tôi. – Macondo2Seattle

+11

@BlackRider nó không phải là. Điều này trả về YES –

+0

Cảm ơn 'gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer' đã thực hiện thủ thuật. – atulkhatri

0

Swift câu trả lời:

let scrollViewPanGesture = UIPanGestureRecognizer(target: self, action: #selector(onPan(_:))) 
scrollViewPanGesture.delegate = self 
scrollView.addGestureRecognizer(scrollViewPanGesture) 

extension ViewController: UIGestureRecognizerDelegate { 
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
     return true 
    } 
} 
Các vấn đề liên quan