上的UIScrollView AND上的UIView的部件[其置于内部的UIScrollView]检

2019-06-27 18:09发布

我对其中包含的UIScrollView这是摆在整个表面(1024×768),我简单的故事板的iPad项目的UIViewController。 我创建了3个XIB文件,这是UIViews其上开始我的应用程序加载在viewDidLoad中,并将其添加到UIScrollView的。 每个3个XIB文件只包含一个的UIButton。

这是层次结构:

〜的UIViewController(UIViewControllerClass是类此的UIViewController)

~~的UIScrollView(含有3个相同UIViews)

~~~的UIView(UIViewClass是文件的所有者此XIB文件)

~~~~的UIButton

我想,我的UIViewControllerClass意识到两个:触摸上的UIScrollView组件的任何地方,如果UIScrollView的被触摸,如果UIButton的里面的UIView在UIScrollView的被触摸时,以具有正是按钮被触摸的信息。

我在UIScrollView中制成IBAction为内部UIViewClass触摸上的UIButton内部的UIView和当我设置用户交互启用= YES上的所有元素(的UIViewController,UIView的和的UIScrollView)调用此方法时,它应。

但在这一点上我UIViewControllerClass并不知道里面的触摸发生的UIScrollView上的UIButton。 我做了触摸识别这样的:

UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouch)];
touch.numberOfTouchesRequired = 1;

并把它添加到UIScrollView的组件。 通过这种方式,我能够在UIViewControllerClass上UIScrollView的成分检测触摸事件,但在UIButton的UIView的触摸事件,其任务是里面的UIScrollView不再被调用。

所以,我必须UIViewControllerClass这两个信息:

  • 在UIScrollView的部件触摸作出
  • 轻触的UIButton在UIView的是里面的UIScrollView(如果该按钮被感动)制成

我想,触摸事件识别器连接到整个UIScrollView的分量不是解决方案,因为它禁用所有触摸事件处理我里面UIViewClass写道。

我认为解决方案是,在某种程度上触及这些都对里面的UIScrollView UIView的部件制成,应派人来UIViewControllerClass,但我没有找到一个方法来做到这一点。

如果有人能帮助我,我会非常感激。 提前致谢。


[编辑#1:郑答案]

点击手势必须设置为NO cancelsTouchesInView选择!

对于以上我的情况下,该行解决一切问题:

touch.cancelsTouchesInView = NO;

非常感谢郑。

Answer 1:

我不知道这是否适用于你或没有,但我已经给有关内滚动视图这里景色触摸事件的答案:

驳回键盘在一个UIScrollView

这样做是为了告诉了滚动不滚动视图区域内吞下了所有的轻敲姿势。

我会在这里反正粘贴代码,希望它能解决你的问题:

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];
}


Answer 2:

你也可以继承你的UIScrollView并重写方法- hitTest:withEvent:它是由系统调用,以确定哪个视图将会处理该事件。 当它被调用时,你可以假设触摸事件滚动视图内发生,并通过调用超级实现,就可以得到这通常会处理该事件的看法。



Answer 3:

你可以捕捉任何类型的UIScrollView的手势。 请确保您还处理一些默认属性,以及像设置cancelsTouchesInView属性设置为false,它默认为true。 也给一些标签号到您的子视图中选择来区分。 &也使他们的用户交互为true。

让自来水= UITapGestureRecognizer(目标:自我,动作:

选择(didTapByUser(_ :)))



文章来源: Detect touch event on UIScrollView AND on UIView's components [which is placed inside UIScrollView]