在UIPanGestureRecognizer和重新启用的UIScrollView之间连续滚动

我有一个启用分页的UIScrollView ,我已经添加了我自己的UIPanGestureRegonizer 。 在某些情况下,我的视图控制器将设置scrollview.scrollEnabled = NO ,然后添加平移手势识别器(我不使用scrollview自己的识别器)。

所以,滚动禁用,但我正在等待我的手势识别器的用户触摸。 当它识别时,它会调用其重新启用滚动的操作。

问题是,当用户仍然有一个手指下来,我的滚动视图不会用手指跟踪。 直到手指抬起然后再次拖动,它才开始滚动。 所以我的手势识别器吞咽所有的触摸,不转发任何滚动视图。

我试过切换panGestureRecognizer.cancelsTouchesInView = NO; 但它似乎没有任何效果(我目前正在删除这个识别器,只要我重新启用滚动,但是否我这样做或不解决我的问题)。 我也研究了UIGestureRecognizerdelays...属性,但它们似乎也没有帮助。

有任何想法吗? 我怎样才能让这些事件继续前进到我的滚动视图?

如果你只针对iOS 5或更高版本,答案会更简单,因为在这种情况下,你真的应该重用UIScrollView的panGestureRecognizer属性。

在任何情况下,关键的一步是不重用scrollEnabled,而是inheritanceUIScrollView的子类,创build自己的属性来pipe理这个状态,并覆盖setContentOffset :.

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

这里有一个可能的iOS 4+解决scheme:

  1. 子类UIScrollView(或者UIScrollView的另一个子类的子类,根据您的需要)。
  2. 覆盖所有初始化程序以确保您的设置代码被调用。
  3. 声明BOOL属性并覆盖setContentOffset:如上所述。
  4. 在你的设置代码中,设置一个UIPanGestureRecognizer并设置你的状态variables以允许程序滚动(假设这是你想要的默认状态):

     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. pipe理哪些手势可以同时发生。 在我的情况下:

     - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } 
  6. 在需要的地方转动程序滚动。 例如:

     - (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer { self.programaticScrollEnabled = YES; } - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { self.programaticScrollEnabled = YES; return YES; }