在滚动视图上拖动视图:收到touchesBegan,但未收到touchesEnded 或touchesCancelled

2024-03-23

作为一名 iOS 编程新手,我正在努力解决iPhone 上的文字游戏 https://github.com/afarber/ios-newbie/tree/master/ScrollContent.

应用程序结构是:scrollView -> contentView -> imageView -> image 1000 x 1000 (here 全屏 https://i.stack.imgur.com/R8gUv.png):

我想我终于明白了如何使用UIScrollView在 Xcode 5.1 中启用自动布局:

我只是为contentView这定义了_scrollView.contentSize(我不必明确设置它)-之后我的游戏板滚动和缩放就可以了。

但是,我在实现可拖动字母图块时遇到了麻烦Tile.m https://github.com/afarber/ios-newbie/blob/master/ScrollContent/ScrollContent/Tile.m.

I use touchesBegan, touchesMoved, touchesEnded, touchesCancelled而不是手势识别器(正如 StackOverflow 用户经常建议的那样),因为我显示带有阴影的较大字母图块图像(bigImage) on touchesBegan.

我的拖动是通过以下方式实现的:

  1. In touchesBegan我把瓷砖从contentView(并将其添加到主应用程序视图)并显示bigImage与阴影。
  2. In touchesMoved我移动瓷砖
  3. In touchesEnded or touchesCancelled我显示smallImage再次添加阴影并 - 将图块添加到contentView或将其保留在主视图中(如果图块位于应用程序的底部)。

我的问题:

大多数情况下这是有效的,但有时(经常)我看到只有touchesBegan被称为,但另一个touchesXXXX方法永远不会被调用:

2014-03-22 20:20:20.244 ScrollContent[8075:60b] -[Tile touchesBegan:withEvent:]: Tile J 10 {367.15002, 350.98877} {57.599998, 57.599998}

相反,scrollView用手指在大图块下方滚动。

这会导致我的应用程序屏幕上出现许多带有阴影的大图块,而滚动视图则被拖动到它们下面:

请问如何解决这个问题?

我确信我的应用程序结构(带有自定义UIViews 被拖入/拖出UIScrollView)是可能的——通过查看流行的文字游戏。

I use tile.exclusiveTouch = YES and contentView 的自定义 hitTest 方法 https://github.com/afarber/ios-newbie/blob/master/ScrollContent/ScrollContent/GameBoard.m- 但这没有帮助:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView* result = [super hitTest:point withEvent:event];

    return result == self ? nil : result;
}

更新1:

我尝试添加以下代码handleTileTouched:

_contentView.userInteractionEnabled = NO;
_scrollView.userInteractionEnabled = NO;
_scrollView.scrollEnabled = NO;

然后将其设置回YES in handleTileReleased of 视图控制器.m https://github.com/afarber/ios-newbie/blob/master/ScrollContent/ScrollContent/ViewController.m- 但这没有帮助,而且对我来说看起来更像是一个黑客。

更新2:

可能已经阅读了与以下内容相关的所有内容UIScrollView, hitTest:withEvent: and pointInside:withEvent:- 在网络上(例如黑客响应链 http://bynomial.com/blog/?p=74和马特·纽伯格的iOS 编程 http://www.apeth.com/iOSBook/ch18.html#_hit_testing书),StackOverflow 和 Safari,在我看来,解决方案是实现hitTest:withEvent:我的应用程序主视图的方法:

If a Tile物体被击中,它应该被返回。否则 -scrollView应该被退回。

不幸的是,这不起作用——我可能遗漏了一些小东西。

我确信存在一个好的解决方案 - 通过研究 iOS 上流行的文字游戏。例如,在 Zynga 中,字母图块的拖动和放置工作非常顺利与朋友的话® http://www.wordswithfriends.com应用程序,在下面的屏幕截图中您可以看到他们可能使用UIScrollView(滚动条在角落可见)并显示平铺阴影(可能在touchesBegan方法):

更新3:

我创建了一个新项目来测试手势识别器 https://github.com/afarber/ios-newbie/tree/master/Recognizer由 TomSwift 建议,它显示了我在手势识别器方面遇到的问题:图块大小更改得太晚 - 当用户开始移动图块时而不是在他触摸它的那一刻,就会发生这种情况:


这里的问题是,从视图层次结构中删除视图会使系统感到混乱,失去了触摸感。这是同样的问题(内部手势识别器使用相同的touchesBegan: API).

https://github.com/LeoNatan/ios-newbie/commit/4cb13ea405d9f959f4d438d08638e1703d6c0c1e https://github.com/LeoNatan/ios-newbie/commit/4cb13ea405d9f959f4d438d08638e1703d6c0c1e(我创建了一个拉取请求。)

我所做的更改是在触摸开始时不从内容视图中删除图块,而仅在触摸结束或取消时移动。但这会产生一个问题 - 当拖动到底部时,图块隐藏在视图下方(由于滚动视图剪切到其边界)。因此,我创建了一个克隆图块,将其添加为视图控制器视图的子视图,并将其与原始图块一起移动。当触摸结束时,我移除克隆的图块并将原始图块放置在它应该去的地方。

这是因为底部栏不是滚动视图层次结构的一部分。如果是的话,就不需要克隆整个图块。

我还简化了瓷砖的定位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在滚动视图上拖动视图:收到touchesBegan,但未收到touchesEnded 或touchesCancelled 的相关文章

  • @IBDesignable 错误:IB Designables:无法更新自动布局状态:Interface Builder Cocoa Touch Tool 崩溃

    我有一个非常简单的 UITextView 子类 它添加了 占位符 功能 您可以在文本字段对象中找到该功能 这是我的子类代码 import UIKit import Foundation IBDesignable class Placehol
  • 将文件保存到 icloud 驱动器

    我正在尝试将文件保存到 icloud 驱动器 我要使用简单版本 不让用户选择保存文件的位置 我只是将其保存在 icloud 驱动器的根目录中 这是我正在使用的代码 func exportToFiles for page in pages l
  • 如何“旋转”图层/视图(例如,就像在 enigmo 中一样)

    我知道如何根据触摸移动图层 但我也希望能够旋转图像 是否有任何示例代码显示如何执行此操作 或者有人可以给我一些建议吗 Thanks 最简单的方法是使用图层的变换属性 float angle M PI rotate 180 or 1 radi
  • 如何通过情节提要向导航栏添加后退按钮?

    我现在很困惑 我在网上到处都看到添加自定义后退按钮的教程 但我什至似乎无法启动默认按钮 在我的 MainViewController 中 我有performSegueWithIdentifier 然后在另一端 我希望导航栏在左侧有后退按钮
  • 使用 Javascript 获取 Mobile Safari 中选定的文本

    因此 我正在开发一个小书签 对于我来说 使用 循环 获取用户选择的内容是理想的选择 window getSelection 和 document getSelection 都是我可以调用的函数 但是它们始终返回空字符串 我相信问题在于 当您
  • iPhone 6 隐藏在键盘下方的自动校正

    自动修正UITextview在 Iphone5s 中工作正常 但在 iPhone 6 中它被隐藏在键盘后面 在 iPhone 5s 中按预期工作 但不适用于 iphone 6 有什么办法可以解决 iPhone 6 上的这个问题吗 不 去物业
  • 如何确定 NSURLSessionTask 请求何时开始?

    I use NSURLSessionTask我正在尝试监视我的一些 HTTP 请求需要多长时间 我可以监视什么委托方法 或其他方法 NSURLSessionTask实际上提出了最初的请求 如果这是一个NSURLConnection里面一个N
  • 关于 S3 文件传输的权限

    我正在使用 S3TransferManager Sample 进行测试 我创建了Cognito并设置了IAM并最后更改了constants swift文件 我上传没有问题 但下载失败 错误信息是 下载失败 错误域 com amazonaws
  • 将 firebase 框架添加到 ios 项目时出现链接器错误

    我一直在尝试将 firebase 框架添加到我的 ios 应用程序中 我按照这里的说明进行操作 https www firebase com docs ios quickstart html https www firebase com d
  • 横向 xib 显示为纵向

    我有一个视图控制器和单独的纵向和横向笔尖文件 旋转时 我加载相应的笔尖 方法 shouldAutorotateToInterfaceOrientation and willRotateToInterfaceOrientation 接到电话
  • 关系上的核心数据属性?

    我刚刚开始使用核心数据 我有一个Headache实体和一个Medication实体 头痛和药物之间存在多对多的关系 当您加重头痛时 您可以选择多种药物 我希望能够指定这些药物的数量 我对 MySQL 更熟悉 您可以在其中创建一个数据透视表
  • 加载 UIWebView 时如何使用 UIProgressView?

    我正在开发一个应用程序 我在 UIWebView 中加载 urlrequest 并且它成功发生 但现在我试图在加载过程中显示 UIProgressView 从 0 0 到 1 0 它随着加载进度动态变化 我怎样才能做到这一点 UIWebVi
  • ios7 绘图时出现延迟

    我有一个应用程序 在其中我正在视图上绘制一些草图 到目前为止 在我安装之前它运行良好ios7 我的应用程序使用触摸移动方法来识别运动的变化 但是当我画一条线时 触摸方法被调用 但线不会更新 直到我触摸结束ios7 所以画起来有一点点滞后 它
  • iPhone - cancelPerformSelectorWithTarget 不起作用

    如果我在 UIView 的子类中执行此操作 self performSelector selector doSomething withObject nil afterDelay 5 然后像这样取消它 我已经尝试了两个版本 NSRunLoo
  • 通过 CTFontRef 或 CGFontRef 对象中的字形索引获取 unicode 字符

    CTFontRef 提供了出色的方法 例如CTFontGetGlyphsForCharacters用于将字符映射到字形 我的问题是 有没有逆映射的方法 也就是说 我可以通过给定的字形获取字符吗 自从我发现有一个CTFontCopyChara
  • stringFromDate 始终为 NIL

    我知道这是一个重复的问题 但是在 stackoverflow 和 google 上搜索了许多类似的问题后 没有一个解决方案对我有用 我正在尝试将从数据库收到的日期转换为字符串格式以在 iPhone 应用程序中显示 我正在按以下方式将日期转换
  • 如何使用 Expo 播放 Youtube 视频

    我正在尝试使用反应本机 YouTube 组件 https github com inProgress team react native youtube在我的世博项目中 但是 我无法让它发挥作用 到目前为止 我所拥有的只是带有红色边框的黑屏
  • 有没有任何工具可以将 PVR 纹理分割成一组图块?

    我有一张大的 png 纹理 4096x4096 我需要将其部分加载到内存中 我已经将大 png 纹理分割成 16 个 1024x1024 块 然后将它们转换为 PVR 压缩文件 问题是 当我绘制这些图块时 图块之间的边缘与 png 的边缘不
  • UITableView 自动调整行大小约束在 iPhone 6Plus 上神秘破坏

    我有一个自定义的 UITableViewCell 它有一个缩略图和一堆文本 行高配置为使用自动计算 tableView estimatedRowHeight 129 tableView rowHeight UITableViewAutoma
  • 如何在运行时更改 UIMenu 内 UIAction 的状态?

    如何更改 UIAction 的状态 目标是切换 UIMenu 内 UIAction 旁边的状态复选标记 更改 UIAction 的state通过存储在视图控制器中的引用似乎根本不会改变状态 我错过了什么吗 View Controller i

随机推荐

  • 在 C 中使用 mmap 读取二进制文件时出现段错误

    我正在尝试在 C 中使用 mmap 只是为了看看它到底是如何工作的 目前我尝试使用 mmap 逐字节读取二进制文件 我的代码是这样的 include
  • Android - 在 invalidate() 上重绘后监听器

    在我要求视图失效后 我希望在视图完成重绘后收到通知 正如中所述这个答案 https stackoverflow com a 5073130 72746 the invalidate 方法不调用视图的onDraw UI 立即执行 但会在消息队
  • 索引 null 变量时未引发 php 未定义索引通知

    我很想知道 PHP 中的以下行为是否是有意的 而且 如果有意的话 通过创建索引来从空变量初始化数组被认为是可以接受的 如第一个代码片段中所做的那样 error reporting E ALL arr null echo arr blah n
  • 我可以制作两栏水晶报表吗?

    我有一份报告 其中包含该月每一天的一个详细信息行 我想在左侧的一个 组列 中显示第 1 到 15 天的信息 在右侧显示其他天的信息 每个 组列 都包含四个信息列 我可以通过拆分报告数据库查询列来手动完成此操作 但我真的希望有一种更优雅的方法
  • Objective C 距离字符串格式化程序

    我有一个距离作为浮动 我正在寻找一种方法来为人类读者很好地格式化它 理想情况下 我希望随着它变大 它从 m 变为 km 并很好地舍入数字 转换成里程将是一个额外的好处 我确信很多人都需要其中之一 我希望有一些代码在某个地方 这是我想要的格式
  • 在init块中初始化变量并在kotlin中为该变量定义一个setter

    我想写这段代码 但它不起作用 private var a Int set value field a Code init a 2 我必须在声明变量时对其进行初始化 为什么会发生这种情况 我该如何解决 您的属性有一个自定义设置器 当您调用时a
  • Magento:在一页结账中显示审核步骤

    我一生都无法弄清楚这一点 我想立即在 Magento 的一页结账上显示订单审核步骤 处理订单之前的最后一步 有什么建议么 谢谢大家 如果你查看 onepage phtml 的底部 你会看到 accordion openSection opc
  • 如何通过 Scala 中的 Play Framework 2.5 流式传输压缩文件(即时)?

    我想流式传输一些文件并即时压缩它们 以便用户可以将多个文件下载到一个压缩文件中 而无需向本地磁盘写入任何内容 但是 我当前的实现将所有内容保存在内存中 并且不适用于大文件 有什么办法可以解决吗 我正在研究这个实现 https gist gi
  • FCM 数据消息无法在 Firefox 中加载

    我正在使用 Web FCM 进行云消息传递 当我发送一个通知有了标题和正文 Firefox 和 Chrome 都会显示通知并且工作正常 但是当我尝试发送 FCM 时Data消息 Firefox 不接收和记录消息 我正在使用一个HTTPS安全
  • 如何鼓励 MediaWiki 上的非匿名编辑?

    Problem 在工作中我们有一个部门维基 运行媒体维基 http www mediawiki org 不幸的是有几个 人们在没有登录的情况下进行编辑 这使得追踪变得非常困难 向下编辑询问有关内容的问题 有两种策略可以改善这一点 鼓励登录编
  • Jquery .delay().fadeOut 取消/清除队列..可能吗?如何?

    我需要一些帮助 是否可以取消链接延迟 Mn Base TopBox show function timedur element fadeIn delay timedur fadeOut Mn Base TopBox cancelFadeou
  • Android:ScrollView 不滚动

    我正在尝试创建一个布局 其中包含标题 标题下方的横幅 然后横幅下有几个 ListView 我希望除标题之外的整个屏幕都可以滚动 现在我知道 ListView 不会在 ScrollView 中滚动 因此我将 ListView 的高度设置得足够
  • wpf mvvm ..访问视图模型中的视图元素

    我正处于学习 wpf mvvm 的阶段 因为我知道在 vm 中我们声明命令并将它们绑定到视图元素的事件 而不是在代码隐藏文件中执行此操作 我没有得到的是 我们将如何访问视图元素和事件参数 您的 ViewModel 不会直接访问视图中的元素
  • Luis 的 Azure 密钥不可用

    我正在尝试发布我的 LUIS 应用程序的暂存版本 我已在 Azure 澳大利亚东部设置了认知服务应用程序 并且可以在 Azure 门户中看到密钥 然而在 AU Luis 门户网站中https au luis ai https au luis
  • 使用相同的 udp 套接字进行异步接收/发送

    我在 udp 服务器中使用相同的套接字 以便在某个端口上接收来自客户端的数据 然后在处理请求后使用 ip ud socket async send to 响应客户端 接收也是与 async receive from 异步完成的 套接字使用相
  • Knuth 计算机编程艺术 ex 1.1.8

    我无法理解 Knuth 在第 1 1 章练习 8 的说明中的含义 任务是制定一个有效的两个正整数的 gcd 算法m and n使用他的符号theta j phi j b j and a j 其中 theta 和 phi 是字符串 a and
  • 如何访问 Mercurial 进程内挂钩中的提交消息?

    我一直在努力 def debug hook ui repo kwargs changectx repo None ui status change desc s n changectx description return True 但它总
  • 通过 Emacs 启动时如何配置 SBCL 以使用更多 RAM?

    如何配置 SBCL 使其在使用 Emacs 中的 M x slime 启动时使用比默认值更多的内存 从我在网上看到的情况来看 答案似乎是调用 SBCL 传递参数 dynamic space size 由于我不直接调用 SBCL 因此我不知道
  • FPDF 和欧元符号的问题

    我花了几天时间筛选各种方法来鼓励 FPDF 渲染欧元符号 但没有成功 我有 currency iconv UTF 8 ISO 8859 1 TRANSLIT 结果是 iconv function iconv 检测到不完整的多字节字符 在输入
  • 在滚动视图上拖动视图:收到touchesBegan,但未收到touchesEnded 或touchesCancelled

    作为一名 iOS 编程新手 我正在努力解决iPhone 上的文字游戏 https github com afarber ios newbie tree master ScrollContent 应用程序结构是 scrollView gt c