触摸放置在UIScrollView中的UIView上没有调用的方法

时间:2012-03-05 13:39:26

标签: ios uiview uiscrollview touches

我有自定义滚动视图,子类化UIScrollView。我在viewcontroller nib文件中添加了一个滚动视图,并将其类更改为CustomScrollView。现在,这个自定义滚动视图(由xib制作)被添加为self.view上的子视图。

在这个滚动视图中,我从xib添加了3个文本字段和1个UIImageView(名为signImageView)。点击UIImageView(添加TapGestureRecogniser)后,会在自定义滚动视图中添加名为signView的UIView。我想允许用户在这个视图上签名,所以我创建了一个类Signature.m和.h,子类化UIView并实现了touches方法(touchesBegan,touchesMoved和touchesEnded)并初始化了signView,如下所示: / p>

signView = [[Signature alloc]initWithFrame:signImageView.frame];
    [customScrollView addSubview:signView];

但是当我开始在signView上签名时,视图会滚动,因此不会调用touches方法。

我尝试在self.view上添加signView而不是自定义滚动视图,但在这种情况下,当我开始滚动时,视图仍然粘在固定位置。 (在这种情况下,它的框架保持固定)

3 个答案:

答案 0 :(得分:7)

尝试将canCancelContentTouches的{​​{1}}设为scrollView,将NO设为delaysContentTouches

修改

我看到这里回答了类似问题Drag & sweep with Cocoa on iPhone(答案完全相同)。

如果用户点击持有YES(约0.3-0.5秒),那么查看signView方法会被触发,此时所有事件都会转到{ {1}}直到touchesBegan:被调用。

如果用户快速浏览signView,则touchesEnded:接管。

由于您已经实施了signView个子UIScrollView方法,因此您可以以某种方式向用户表明您的应用已准备好让他签名(' 绿灯'等价物。)

您也可以使用UIView关闭此绿灯

如果您将touchesBegan:添加为touchesEnded: signImageView(而不是subView)并在signView被触发时隐藏它,可能会更好。您可以将customScrollView添加到touchesBegan:,而不是在现有代码中添加signView的位置。

通过这种方式,您可以实现在该位置实际上只有一个customScrollview(以获得更好的触摸传递效率。并且您可以通过取消隐藏{{来实现绿灯效果1}}在signImageView

如果这个app-behavior(0.3-0.5s延迟)是不可接受的,那么你还需要继承subView。 Vignesh的覆盖signImageView touchesBegan:/touchesEnded:的方法可能会得到拯救。在那里,您可以检测到UIScrollView中的触摸是否正常,并立即将其传递给该视图。

答案 1 :(得分:3)

当你在视图层次结构中添加一个滚动视图时,它会吞下所有的触摸。因此你没有开始接触。因此,要在您的登录视图中获得触摸,您必须将触摸传递给登录视图。 This就是这样做的。

答案 2 :(得分:0)

我们使用UIScrollView子类实现了此功能,该子类禁用了您提供的视图列表的平移手势识别器。

class PanGestureSelectiveScrollView: UIScrollView {

  var disablePanOnViews: [UIView]?

  override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    guard let disablePanOnViews = disablePanOnViews else {
      return super.gestureRecognizerShouldBegin(gestureRecognizer)
    }

    let touchPoint = gestureRecognizer.location(in: self)
    let isTouchingAnyDisablingView = disablePanOnViews.first { $0.frame.contains(touchPoint) } != nil

    if gestureRecognizer === panGestureRecognizer && isTouchingAnyDisablingView {
      return false
    }
    return true
  }
}