我有一个观点,可以回到上一个观点。
假设这是一份调查问卷。所以我的主要观点是问卷调查(Controller),它有一个子视图,显示一个有2个可能答案的问题。当一个人回答问题时,按下一个,问卷视图(控制器)显示该特定子视图中的下一个问题。简单,对吧?
好的,现在想象一下,对于一个特定的问题,最多可容纳10个回答。这将需要在子视图中实现滚动视图,以适应问题+所有答案。
现在我的问题:我希望问卷调查(控制器)接收水平滑动的通知(下一个/上一个问题),但我想要所有其他触摸(点击,对于答案的单选按钮,以及滚动视图的垂直滑动)经历......
任何想法是如何解决这个问题的?我尝试了大约5种不同的方法,并在每个方面打破了我的头脑和动力:/ 最后一个(也是最简单的一个),只是将另一个子视图添加到问卷调查(Controller),覆盖问题+答案视图。
亲切地抓住所有的touchesBegan / Moved / Ended / Canceled对我来说,但即使我只是向前推进了各种方法([self nextResponder] ...)基础视图(带有答案,而scrollview)将不再响应...
我有点迷失方向,并且有一天我想写自己的Scrollview,因为UIScrollView是iPhone开发者面临的最可怕的怪物:P
请注意,我支持iPhone OS 3.0及更高版本,因此新的手势API是不行的。
答案 0 :(得分:1)
我不确定你是什么意思“向前采取各种方法”。我不确定nextResponder是否正确转发它们。
问题在于触摸应该在整个生命周期中由一个视图“拥有”。我不确定如何实现UIScrollView或手势识别器,但我很确定它们比你自己做的更多。
我将问卷调查View hitTest:withEvent:
覆盖为return self
。在你的touchesBegan:withEvent:中,调用[super hitTest:[touch locationInView:self] withEvent:event]
并存储“拥有”它的子视图。在touchesMoved:withEvent:中,将触摸转发到相关的子视图,但如果您检测到手势,则“忘记”拥有触摸的子视图,而是调用touchesCancelled:withEvent:。在touchesEnded / Cancelled:withEvent:中,将其转发到子视图,然后忘记拥有的子视图。
它很蹩脚,但它大部分都有效。有些事情是错误的(从子视图的角度来看):