概述
我正在开发一个iPhone游戏,其代码是从另一位开发者那里继承的。游戏网格是一个UIScrollView,其contentSize为1000x1000。该网格包含通过OpenGL的Texture2D类在屏幕上绘制的几个元素。
UIScrollView沿着与您的手指相反的方向滚动。其背后的想法是模拟使用手指“筛选”元素的行为,因为触摸路径上的每个元素都应受到影响/操作。
问题
问题是UIScrollView的滚动会触发touchesCancelled,从而结束游戏所依赖的touchesMoved调用,以了解要操作哪些元素。即使我的手指移动不会在视图中触发滚动,将手指移动超过10个像素的距离也会触发touchesCancelled方法,从而结束未来的touchesMoved调用,直到我抬起手指并开始新的触摸事件。
我确信是滚动事件触发了touchesCancelled方法,因为如果我在视图上设置self.scrollingEnabled = NO;
,在屏幕上移动手指会像应该一样继续触发touchesMoved,无论我在屏幕上移动手指多远,当我抬起手指时,touchesEnded会按预期调用(在我完成筛选元素后),并且触摸路径上的每个元素确实会被操作。然而,设置此属性自然会阻止游戏网格的所需滚动。
尝试解决问题但失败的方法
我尝试在视图的initWithFrame方法中设置self.canCancelContentTouches = NO;,但是仍然会触发touchesCancelled,不确定为什么会这样!也许我把它放错了位置,但是我不确定这是否是我的问题解决方案,因为文档表明这样的设置会防止滚动: "If the value of this property is NO, the scroll view does not scroll regardless of finger movement once the content view starts tracking." 显然这不是我想要的行为,因此该属性似乎并不是我感兴趣的。虽然我仍然困惑于为什么它仍然会滚动并调用touchesCancelled,但我偏离了主题。我还添加了方法- (BOOL)touchesShouldCancelInContentView:(UIView *)view,但它没有被调用,甚至没有设置self.canCancelContentTouches = NO;作为文档指出,将canCancelTouches属性设置为NO确实会阻止调用touchesShouldCancelInContentView方法:"The scroll view does not call this method if the value of the canCancelContentTouches property is NO." 虽然文档似乎不清楚从这种方法返回NO是否也会像canCancelContentTouches = NO;设置那样防止滚动。如果不是,则应该是理想的解决方案。再次提醒一下,我不知道为什么甚至没有调用此方法,因为文档只提到一个阻止其被调用的属性/设置,即使该属性未被设置为NO(因此默认为YES),它仍然没有被调用。
那么现在我不知道该怎么办了。事实是,视图开始滚动后,我仍需要继续调用touchesMoved。是否可能?如果不行,我有哪些选择?