11

UIScrollView启用了分页功能,并添加了自己UIPanGestureRegonizer的功能。在某些情况下,我的视图控制器将设置scrollview.scrollEnabled = NO,然后将平移手势识别器添加到它(我没有使用滚动视图自己的识别器)。

因此,滚动被禁用,但我正在等待来自我的手势识别器的用户触摸。当它识别出来时,它会调用它的动作,在该动作中我重新启用滚动。

问题是,虽然用户的手指仍然向下,但我的滚动视图并没有用手指跟踪。在抬起手指然后再次拖动之前,它不会开始滚动。所以我的手势识别器正在吞下所有的触摸,而不是将任何触摸转发到滚动视图。

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

有任何想法吗?如何让这些事件继续转发到我的滚动视图?

4

1 回答 1

5

如果您只针对 iOS 5 及更高版本,答案会更容易一些,因为在这种情况下,您确实应该重用 UIScrollView panGestureRecognizer 属性。

在任何情况下,关键步骤是不要重用 scrollEnabled,而是继承 UIScrollView,创建自己的属性来管理此状态,并覆盖 setContentOffset:。

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

这是一种可能的 iOS 4+ 解决方案:

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

    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. 管理可以同时发生的手势。就我而言:

    - (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;
    }
    
于 2012-01-25T00:31:54.110 回答