2012-01-03 41 views
11

Tôi đã bật UIScrollView khi bật phân trang và tôi đã thêm UIPanGestureRegonizer của riêng mình vào đó. Trong một số trường hợp nhất định, trình điều khiển chế độ xem của tôi sẽ đặt scrollview.scrollEnabled = NO và sau đó thêm trình nhận dạng cử chỉ di chuyển vào nó (Tôi không sử dụng trình nhận dạng riêng của scrollview).Cuộn liên tục giữa UIPanGestureRecognizer và bật lại UIScrollView

Vì vậy, việc di chuyển bị tắt nhưng tôi đang đợi người dùng chạm vào từ trình nhận dạng cử chỉ của tôi. Khi nó nhận ra, nó gọi hành động của nó trong đó tôi kích hoạt lại cuộn.

Vấn đề là, trong khi người dùng vẫn còn một ngón tay xuống, scrollview của tôi không theo dõi bằng ngón tay. Nó không bắt đầu di chuyển cho đến khi ngón tay được nhấc lên và sau đó kéo lại. Vì vậy, công cụ nhận dạng cử chỉ của tôi đang nuốt tất cả các thao tác chạm và không chuyển tiếp bất kỳ thao tác nào đến scrollview.

Tôi đã cố gắng chuyển đổi panGestureRecognizer.cancelsTouchesInView = NO; nhưng dường như không có hiệu lực (tôi hiện đang xóa trình nhận dạng này ngay khi tôi bật lại cuộn nhưng liệu tôi có thực hiện việc này hay không không giải quyết được sự cố của mình) . Tôi cũng đã xem xét các thuộc tính delays... của UIGestureRecognizer nhưng chúng dường như không giúp được gì.

Bất kỳ ý tưởng nào? Làm thế nào tôi có thể nhận được những sự kiện này để tiếp tục chuyển tiếp đến scrollview của tôi?

+0

Bạn có cố gắng trở về 'YES' trong 'gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:' phương pháp? – Hejazi

+0

@Hejazi Có, tôi đã thực hiện phương thức ủy nhiệm đó (và thiết lập ủy nhiệm của tôi) nhưng nó không được gọi khi ngón tay vẫn còn xuống (chỉ một lần tôi đã nâng lên và đặt ngón tay xuống lần nữa để thực hiện phương thức ủy nhiệm này) . – jbrennan

Trả lời

5

Câu trả lời sẽ dễ dàng hơn một chút nếu bạn chỉ nhắm mục tiêu iOS 5 trở lên, bởi vì trong trường hợp đó bạn thực sự nên sử dụng lại thuộc tính panGestureRecognizer của UIScrollView.

Trong mọi trường hợp, bước quan trọng là KHÔNG sử dụng lại scrollEnabled, nhưng thay vào đó là lớp con UIScrollView, hãy tạo thuộc tính của riêng bạn để quản lý trạng thái này và ghi đè setContentOffset :.

- (void) setContentOffset:(CGPoint)contentOffset 
    { 
     if(self.programaticScrollEnabled) 
      [super setContentOffset:contentOffset]; 
    } 

Dưới đây là một iOS có thể 4+ Giải pháp:

  1. Subclass UIScrollView (hoặc phân lớp khác lớp con của UIScrollView, tùy thuộc vào nhu cầu của bạn).
  2. Ghi đè tất cả trình khởi tạo để đảm bảo mã thiết lập của bạn được gọi.
  3. Khai báo thuộc tính BOOL và bộ ghi đèContentOffset: như được mô tả ở trên.
  4. Trong mã thiết lập của bạn, thiết lập một UIPanGestureRecognizer và thiết lập biến trạng thái của bạn để cho phép di chuyển programatic (giả sử đó là trạng thái mặc định bạn muốn):

    panRecognizer = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)] autorelease]; 
    //These properties may change according to your needs 
    panRecognizer.cancelsTouchesInView = NO; 
    panRecognizer.delaysTouchesBegan = NO; 
    panRecognizer.delaysTouchesEnded = NO; 
    [self addGestureRecognizer:panRecognizer]; 
    panRecognizer.delegate = self; 
    
    self.programaticScrollEnabled = YES; 
    
  5. Quản lý mà cử chỉ có thể xảy ra cùng một lúc. Trong trường hợp của tôi:

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
    { 
        return YES; 
    } 
    
  6. Bật cuộn chương trình trở lại bất cứ nơi nào bạn cần. Ví dụ:

    - (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer 
    { 
        self.programaticScrollEnabled = YES; 
    } 
    
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
    { 
        self.programaticScrollEnabled = YES; 
        return YES; 
    } 
    
Các vấn đề liên quan