iphone - 在不触发 touchesCancelled 的情况下滚动 UIScrollView

标签 iphone objective-c cocoa-touch uiscrollview touchesmoved

概览

我正在开发一个 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/

相关文章:

iphone - UITextView 中简单链接的最佳方法

iphone - isAvailableForServiceType 总是返回 true?

ios - UICollectionViewCell 带有约束的动画

iphone - 在自定义数字键盘上的按键上点击播放声音

ios - 如何使用 Instagram API 获取我的关注者的关注者列表

iphone - 我的应用程序中的水平分页

ios - 将其他 ViewController 推送到 UINavigationController 的最佳方法

ios - 如何创建要在运行时着色的模板图像

ios - AVCamPreviewView 初始化缓慢,有时会在关闭/重新打开 View 后导致崩溃 - 使用 AVCam 示例项目

ios - 如何解决 Cocoa touch 框架中的符号名称冲突