【问题标题】:Detect touch event on UIScrollView AND on UIView's components [which is placed inside UIScrollView]在 UIScrollView 和 A View 的组件上检测触摸事件 [放置在 UIScrollView 内]
【发布时间】: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


    【解决方案1】:

    您可以继承您的 UIScrollView 并覆盖系统调用的方法 - hitTest:withEvent: 以确定哪个视图将处理事件。每当调用它时,您可以假设滚动视图内部发生了触摸事件,通过调用超级实现,您可以获得正常处理该事件的视图。

    【讨论】:

    • 非常感谢您的回答,但是当张也回答我时,我检查了我的问题的答案,我尝试了他的解决方案,这对我有用。再次感谢!
    【解决方案2】:

    我不知道这是否适合你,但我在这里给出了关于滚动视图内视图的触摸事件的答案:

    Dismissing the keyboard in a 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];
    }
    

    【讨论】:

    • 非常感谢!你的这个问题与我的无关,但包含一条对我来说非常重要的行,其中包含我不知道 UITapGestureRecognizer 具有的选项 - cancelsTouchesInView。我不知道此选项默认设置为 YES,现在当我将其设置为 NO 时,我能够检测到 UIScrollView 上的触摸,并且如果 UIScrollView 内触摸的元素具有它的触摸处理程序,则该处理程序正在也叫了。再次感谢你,你用那条线解决了我的问题。
    【解决方案3】:

    您可以在 UIscrollView 中捕捉任何类型的手势。确保您还处理了一些默认属性,例如将 cancelsTouchesInView 属性设置为 false,默认情况下为 true。还要为您的子视图提供一些标签号,以在选择器中进行区分。 & 还使他们的用户交互成为真实的。

    让点击 = UITapGestureRecognizer(目标:自我,动作:

    选择器(didTapByUser(_:)))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 2011-10-01
      相关资源
      最近更新 更多