我在我的简单故事板IPad项目上有UIViewController,它包含放置在整个表面(1024 x 768)上的UIScrollView。我创建了3个XIB文件,这些文件是我的应用程序在viewDidLoad中启动时加载的UIViews,并将它们添加到UIScrollView中。这3个XIB文件中的每一个只包含一个UIButton。
这是层次结构:
~UIViewController( UIViewControllerClass 是这个类 的UIViewController)
~~ UIScrollView(包含3个相同的UIViews)
~~~ UIView( UIViewClass 是此XIB文件的文件所有者)
~~~~ 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中的UIButton触摸事件处理程序不再被调用。
所以,我需要在UIViewControllerClass中有这两个信息:
我认为将触摸事件识别器附加到整个UIScrollView组件不是解决方案,因为它禁用了我在UIViewClass中编写的所有触摸事件处理程序。
我认为解决方案是,在UIScrollView中的UIView中对组件进行的某些操作应该发送到UIViewControllerClass,但我没有找到一种方法来执行此操作。
如果有人能帮助我,我会非常感激。提前谢谢。
[编辑#1:郑的答案]
点击手势必须将 cancelsTouchesInView 选项设置为否!
对于我的上述情况,这一行解决了所有问题:
touch.cancelsTouchesInView = NO;
非常感谢郑。
答案 0 :(得分:17)
我不知道这是否适合您,但我在这里给出了关于scrollview中视图的触摸事件的答案:
Dismissing the keyboard in a UIScrollView
这个想法是告诉scrollView不要吞下滚动视图区域内的所有点击手势。
我会在这里粘贴代码,希望它能解决你的问题:
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
// prevents the scroll view from swallowing up the touch event of child buttons
tapGesture.cancelsTouchesInView = NO;
[pageScrollView addGestureRecognizer:tapGesture];
[tapGesture release];
...
// method to hide keyboard when user taps on a scrollview
-(void)hideKeyboard
{
[myTextFieldInScrollView resignFirstResponder];
}
答案 1 :(得分:3)
您可以对UIScrollView进行子类化,并覆盖系统调用的方法- hitTest:withEvent:
,以确定哪个视图将处理该事件。无论何时调用它,您都可以假设在滚动视图中发生了触摸事件,并且通过调用超级实现,您可以获得通常会处理事件的视图。
答案 2 :(得分:0)
您可以在UIscrollView中捕获任何类型的手势。确保您还处理一些默认属性,例如将cancelsTouchesInView属性设置为false,默认情况下为true。还要为子视图指定一些标记,以区分选择器。 &安培;也使他们的用户互动成为现实。
让tap = UITapGestureRecognizer(目标:自我,行动:
选择器(didTapByUser(_:)))