Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone-捕捉水平滑动-之前-子视图_Iphone_Uiviewcontroller_Uiscrollview_Gestures_Swipe - Fatal编程技术网

iPhone-捕捉水平滑动-之前-子视图

iPhone-捕捉水平滑动-之前-子视图,iphone,uiviewcontroller,uiscrollview,gestures,swipe,Iphone,Uiviewcontroller,Uiscrollview,Gestures,Swipe,我有一个视图,可以回到以前的视图 假设这是一份调查问卷。所以我的主要观点是questionnaireView(控制器),它有一个子视图,显示了一个问题和两个可能的答案。当回答问题时,按next,questionnaireView(控制器)在该特定子视图中显示下一个问题。很简单,对吧 好的,现在想象一下,对于一个特定的问题,必须容纳多达10个Anwer。这需要在子视图中实现一个scrollview,以适应问题+所有答案 现在我的问题是:我希望questionnaireView(控制器)收到水平滑动

我有一个视图,可以回到以前的视图

假设这是一份调查问卷。所以我的主要观点是questionnaireView(控制器),它有一个子视图,显示了一个问题和两个可能的答案。当回答问题时,按next,questionnaireView(控制器)在该特定子视图中显示下一个问题。很简单,对吧

好的,现在想象一下,对于一个特定的问题,必须容纳多达10个Anwer。这需要在子视图中实现一个scrollview,以适应问题+所有答案

现在我的问题是:我希望questionnaireView(控制器)收到水平滑动的通知(下一个/上一个问题),但我希望所有其他触摸(轻触,用于答案的单选按钮,垂直滑动用于滚动视图)都能通过

你知道怎么做吗?我尝试了5种不同的方法,每种方法都让我的头脑和动机崩溃:/ 最后一个(也是最简单的一个)只是简单地将另一个子视图添加到questionnaireView(控制器),覆盖了问答视图

这很好地捕捉了我所有的触摸开始/移动/结束/取消,但即使我只是在每个方法中提出了一个建议([self nextResponder]),底层视图(带有答案和滚动视图)也不会再响应了

我有点迷茫了,我想有一天写我自己的Scrollview,因为UIScrollView是iPhone开发者面临的最可怕的怪物:p


请注意,我支持iPhone OS 3.0及更高版本,因此新的手势API是不可行的。

我不确定你所说的“每种方法的前进”是什么意思。我不确定nextResponder是否适合转发给任何一方

问题是,触摸应该在其整个生命周期中由一个视图“拥有”。我不确定UIScrollView或手势识别器是如何实现的,但我非常确定它们所做的比您自己应该做的更多

我将覆盖QuestionnaReview的
hitTest:withEvent:
返回self
。在touchestart:withEvent:,调用
[super-hitTest:[touch-locationInView:self]withEvent:event]
并存储“拥有”它的子视图。在touchesMoved:withEvent:中,将触摸转发到相关子视图,但如果检测到手势,“忘记”拥有触摸的子视图,而是调用touchesCancelled:withEvent:。在touchesEnded/Cancelled:withEvent:,将其转发到子视图,然后忘记拥有的子视图

这很恶心,但基本上是有效的。有些事情会出错(从子视图的角度):

  • -[UIEvent touchesForView:]将返回问题回顾
  • UITouch.view将返回问题回顾
  • UITouch.phase可能未在touch中取消UITouch phase取消:with event:(如果检测到手势并取消触摸)。 *

我还不能让它工作,这是我目前的代码:。我的问题是touchSedend受到了一个永恒的循环的影响,即使我测试“nextResponder”UIView是否不等于self…我觉得这没问题。什么循环?另外请注意,如果您想支持多点触摸,则需要分别存储每个触摸的“下一个响应器”。