我的问题很奇怪但很简单。 我将我的客户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中的MyScrollView的内容偏移量执行自己的方法:withEvent:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
//some implementation according to current content offset
}
用户在屏幕上移动手指,只要手指离开屏幕表面,touchesEnded:withEvent:被调用,我就可以正确实现自己的方法。
但是,当用户将屏幕表面上的手指从屏幕内部移动到顶部或底部的外部时,然后向上抬起手指,touchesEnded:withEvent:方法永远不会被调用,似乎ios不会对待移出边界(顶部或底部)事件作为触摸结束事件,ios也不会知道触摸在屏幕边界之外发生了什么
有人可能会建议我检测touchesMoved中的当前位置:withEvent:检查是否是inbounds。这可能在运动非常缓慢时起作用,但是当你移动得非常快时,系统无法检测到每个点位置,似乎在某个时间间隔内检测到运动。 任何人都可以帮助我如何检测用户手指是否已移出范围答案 0 :(得分:3)
我认为会调用touchesCancelled:withEvent:
方法!
答案 1 :(得分:1)
我已经解决了这个问题
bcs UIScrollView做了太多工作,我们自己无法处理某些事件,幸运的是UIView可以检测到touche移出界限并调用touchesEnd:withEvent:
方法。
考虑到用UIView替换MyScrollView的超类有太多工作要做,所以我想出了一个简单的解决方法:
我添加了一个来自UIView的TouchActionDetectView子类,其工作是检测所有用户触摸事件并将这些事件传递给MyScrollView。当然,我必须清除TouchActionDetectView的背景颜色,以避免阻止其他视图内容。