3

我的问题很奇怪但很简单。我将我的客户 UIScrollView 子类化:MyScrollView,我在其中禁用了滚动:

 self.scrollEnabled = NO; 

这意味着除了

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 

不会调用所有其他 UIScrollViewDelegate 方法,并且在 MyScrollView 我通过检测屏幕上的用户触摸移动来进行内容滚动,也就是说没有翻转,没有反弹,我的实现是在 touchesMoved:withEvent: 方法中

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject];
   // NSLog(@"touch.phase:%d",touch.phase);
    CGPoint currentPosition = [touch locationInView:self];
    CGPoint lastTouchPosition = [touch previousLocationInView:self];
    CGFloat deltaY = lastTouchPosition.y - currentPosition.y;
    CGFloat contentYOffset = self.contentOffset.y + deltaY;
    [self setContentOffset:CGPointMake(0,contentYOffset) animated:NO];

}

用户拖动完成后,我根据 touchesEnded:withEvent 中 MyScrollView 的内容偏移量做我自己的方法:

 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
 {
     //some implementation according to current content offset
 }

用户在屏幕上移动手指,只要手指离开屏幕表面,就会调用 touchesEnded:withEvent: 并且我可以正确实现自己的方法。

但是,当用户在屏幕表面上将手指从屏幕内部移动到顶部或底部外部,然后抬起手指时,touchesEnded:withEvent: 方法从未被调用,似乎 ios 不处理移出边界(顶部或底部)事件作为触摸结束事件,当触摸超出屏幕边界时 ios 也不知道发生了什么

有人可能会建议我检测 touchesMoved:withEvent: 中的当前位置以检查它是否是入站。这可能在运动非常缓慢时起作用,但是当您移动非常快时,系统无法检测到每个点的位置,似乎在某个时间间隔内检测到运动。任何人都可以帮助我如何检测用户手指是否已超出范围

4

2 回答 2

3

我认为该touchesCancelled:withEvent:方法将被调用!

于 2012-07-23T08:22:42.023 回答
1

我已经解决了这个问题 bcs UIScrollView 做了太多的工作,我们无法自己处理一些事件,幸运的是 UIView 可以检测到触摸移动超出范围并调用该touchesEnd:withEvent:方法。考虑到用 UIView 替换 MyScrollView 的超类有太多工作要做,所以我想出了一个简单的解决方法:我添加了一个 UIView 的子类 TouchActionDetectView,它的工作是检测所有用户触摸事件并将这些事件传递给 MyScrollView。当然我必须清除 TouchActionDetectView 的背景颜色以避免阻塞其他视图内容。

于 2012-07-24T17:29:14.030 回答