概览
我正在开发一个 iPhone 游戏,它的代码是从另一个开发者那里继承来的。游戏网格是一个 contentSize 为 1000x1000 的 UIScrollView。网格包含通过 OpenGL 的 Texture2D 类在屏幕上绘制的几个元素。
UIScrollView 的滚动方向与您手指移动的方向相反。这背后的想法是模拟用手指“筛选”元素的行为,因为触摸路径中的每个元素都应该受到影响/操纵。
问题
问题是 UIScrollView 的滚动触发了 touchesCancelled,从而结束了游戏依赖于知道要操作哪些元素的 touchesMoved 调用。即使我的手指移动不会在视觉上触发 View 滚动,移动我的手指超过 10 个像素的距离会触发 touchesCancelled 方法,从而结束 future 的 touchesMoved 调用,直到我抬起手指并开始新的触摸事件。
我确信是滚动事件触发了 touchesCancelled 方法,因为如果我在 View 上设置 self.scrollingEnabled = NO;
,在屏幕上移动手指会继续触发 touchesMoved 作为无论我的手指在屏幕上移动多远,当我抬起手指时(在我完成对元素的筛选之后),touchesEnded 都会按预期被调用,并且触摸/滑动路径中的每个元素确实被操纵如预期的。但是,设置此属性自然会阻止游戏网格的预期滚动。
修复尝试失败
我尝试在 View 的 initWithFrame
方法中设置 self.canCancelContentTouches = NO;
,但是奇怪的是 touchesCancelled
仍然被触发足够的。不知道为什么会这样!也许我弄错了地方,但我不太确定这是否能解决我的问题,因为文档暗示这样的设置无论如何都会阻止滚动:“如果此属性的值是 NO,一旦内容 View 开始跟踪,无论手指移动如何, ScrollView 都不会滚动。” 显然,这不是我所追求的行为,因此该属性似乎不是我感兴趣的毕竟。虽然我仍然对为什么它仍然滚动并调用 touchesCancelled
感到困惑,但我离题了。
我还添加了方法 - (BOOL)touchesShouldCancelInContentView:(UIView *)view
但它没有被调用,即使 没有 设置 self.canCancelContentTouches = NO;
正如文档所说,将 canCancelTouches 属性设置为 NO 确实会阻止调用 touchesShouldCancelInContentView 方法:“如果 canCancelContentTouches 属性的值为 NO,则 ScrollView 不会调用此方法。 “。尽管文档似乎不清楚是否从此方法返回 NO 也会像 canCancelContentTouches = NO;
设置那样阻止滚动。如果没有,那么这应该是理想的解决方案。同样,我不知道为什么甚至没有调用此方法,因为文档只提到了一个阻止它被调用的属性/设置,即使该属性未设置为 NO,它仍然没有被调用(因此默认为 YES)。
我从这里去哪里?
所以现在我很茫然。事实上,我仍然需要 touchesMoved 在 View 开始滚动后继续被调用。这可能吗?如果没有,我有什么选择?
最佳答案
我遇到了完全相同的问题(并且浪费了很多时间)。
然后我尝试尽快设置 cancelsTouchesInView
属性(我在 viewDidLoad
中设置)...它对我有用(as shown here)!
- (void)viewDidLoad {
[super viewDidLoad];
/* other initializations */
scrollView.panGestureRecognizer.cancelsTouchesInView = NO;
}
这适用于 iOS 5。在 iOS 5 之前,您需要遍历所有识别器,找到 panGestureRecognizer,然后设置属性。 所以这应该是一个通用的解决方案:
- (void)viewDidLoad {
[super viewDidLoad];
/* other initializations */
for (UIGestureRecognizer *gesture in scrollView.gestureRecognizers){
if ([gesture isKindOfClass:[UIPanGestureRecognizer class]]){
gesture.cancelsTouchesInView = NO;
}
}
关于iphone - 在不触发 touchesCancelled 的情况下滚动 UIScrollView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5261543/