【发布时间】:2012-08-27 23:03:39
【问题描述】:
我的简单故事板 IPad 项目中有 UIViewController,其中包含放置在整个表面 (1024 x 768) 上的 UIScrollView。我创建了 3 个 XIB 文件,它们是我的应用程序在 viewDidLoad 启动时加载的 UIView,并将它们添加到 UIScrollView 中。这 3 个 XIB 文件中的每一个都只包含一个 UIButton。
这是层次结构:
~ UIViewController (UIViewControllerClass 是这个类 UIViewController)
~~ UIScrollView(包含 3 个相同的 UIView)
~~~ UIView(UIViewClass 是这个 XIB 文件的 File's Owner)
~~~~ UIButton
我希望我的 UIViewControllerClass 能够同时意识到:触摸 UIScrollView 组件上的任意位置,如果触摸 UIScrollView,如果触摸 UIScrollView 中的 UIView 内的 UIButton,以获得确切触摸该按钮的信息。
我在 UIViewClass 中创建了 IBAction,以便在 UIScrollView 中的 UIView 中触摸 UIButton,当我在所有元素(UIViewController、UIView 和 UIScrollView)上设置 User Interaction Enabled = YES 时,该方法被调用。
但此时我的 UIViewControllerClass 并不知道在该 UIButton 上的 UIScrollView 内发生了触摸。我制作了这样的触摸识别器:
UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouch)];
touch.numberOfTouchesRequired = 1;
并将其添加到 UIScrollView 组件。通过这种方式,我能够在 UIViewControllerClass 中检测到 UIScrollView 组件上的触摸事件,但不再调用 UIView 中 UIScrollView 中的 UIButton 的触摸事件处理程序。
所以,我需要在 UIViewControllerClass 中有这两个信息:
- 对 UIScrollView 组件进行了触摸
- 在 UIScrollView 内的 UIView 中触摸 UIButton(如果已触摸此按钮)
我认为将触摸事件识别器附加到整个 UIScrollView 组件不是解决方案,因为它会禁用我在 UIViewClass 中编写的所有触摸事件处理程序。
我认为解决方案是,在 UIScrollView 内的 UIView 中的组件上进行的某种触摸应该被发送到 UIViewControllerClass,但我没有找到这样做的方法。
如果有人可以帮助我,我将不胜感激。提前致谢。
[编辑#1:郑的回答]
点击手势必须将 cancelsTouchesInView 选项设置为 NO!
对于我上面的例子,这条线解决了所有问题:
touch.cancelsTouchesInView = NO;
非常感谢郑。
【问题讨论】:
标签: ios uiscrollview uitapgesturerecognizer