2012-01-03 29 views
11

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

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

问题是,虽然用户仍然有手指向下,但我的滚动视图不会用手指跟踪。直到手指抬起然后再次拖动,它才开始滚动。所以我的手势识别器吞咽了所有的触摸,并且不会将任何内容转发到滚动视图。

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

任何想法?我怎样才能让这些事件继续转发到我的滚动视图?

+0

你尝试返回在''gestureRecognizer YES':shouldRecognizeSimultaneouslyWithGestureRecognizer:'方法? – Hejazi 2012-01-03 20:43:15

+0

@Hejazi是的,我也实现了这个委托方法(并设置了我的委托),但在手指仍然关闭的情况下它不会被调用(只有当我放弃并放下手指时,这个委托方法才会被调用) 。 – jbrennan 2012-01-03 20:51:37

回答

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; 
    } 
    
相关问题