我的问题很奇怪但很简单。我将我的客户 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: 中的当前位置以检查它是否是入站。这可能在运动非常缓慢时起作用,但是当您移动非常快时,系统无法检测到每个点的位置,似乎在某个时间间隔内检测到运动。任何人都可以帮助我如何检测用户手指是否已超出范围