我有一个容器 View Controller 管理它自己的全屏内容 View ,并附有几个手势识别器。 subview Controller 可以覆盖在屏幕的一部分上;它的 Root View 是一个提供不透明背景颜色的 UIView,它被一个 UIScrollView 覆盖,而 UIScrollView 又包含堆栈 View 等的复杂 View 层次结构。
在 subview 中滚动工作正常,任何用户与其 subview 的交互也是如此。我遇到的问题是 ScrollView 本身(即不在其任何 subview 内)上的任何点击或其他非滚动手势都会穿过它后面的空 UIView 并且意外地被 Root View 上的手势识别器处理父(容器) Controller 。我希望这些触摸被 child 的背景 View 吞没,以便它们被忽略/取消。
我的第一个想法是覆盖子 VC 上的 nextResponder 以返回 nil,假设这会阻止触摸事件传递到父 View 。那里没有成功,所以我尝试覆盖子 Controller 上的触摸处理方法(touchesBegan: 等),但它们从未被调用过。然后我将一个简单的 UIView 子类替换为我的子 Controller 的 Root View ,同样尝试了这两种方法。再次为 nextResponder 返回 nil 无效,触摸方法永远不会被调用。
我的响应链看起来完全按照我的预期设置: ScrollView --> 子 VC 的 Root View --> 子 VC --> 父的 Root View --> 父 VC。这让我认为我的 Controller 包含设置正确,并让我怀疑父级 Root View 上的手势识别器以某种我不理解的方式在响应者链中胜出。
这看起来应该很容易。我错过了什么?谢谢!
最佳答案
多亏了this very helpful WWDC video,我想我能更好地理解这里发生了什么.
给定传入触摸,系统首先将该触摸与最深的 HitTest View 相关联;在我的例子中是 UIScrollView。然后它显然会回到 super View 的层次结构中寻找任何其他附加的识别器。文档的这个关键位暗示了这种行为:
A gesture recognizer operates on touches hit-tested to a specific view and all of that view’s subviews.
ScrollView 有自己的内部平移识别器,它可以取消未识别的触摸,或者可能回退到不会碰巧转发响应链的响应方法。这解释了为什么我的响应器方法永远不会被调用,即使我自己的识别器被禁用也是如此。
有了这些信息,我可以想出一些可能的方法来解决我的问题,例如:
但我最终做的只是用一个新的空 View 在顶部重新排列我的 View 层次结构,这样我的子 Controller View 就可以成为主内容 View 的兄弟,而不是它的 subview 。
因此 View 层次结构由此发生变化:
为此:
这解决了我的问题:我的手势识别器不再与针对子 Controller View 进行 HitTest 的触摸进行交互。而且我认为它更好地捕捉了我的应用程序 Controller 之间的概念关系,而不需要任何额外的逻辑。
关于ios - 防止 subview Controller 上未处理的触摸事件传递到容器 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46539898/
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s