5

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

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

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

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

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

4

3 回答 3

7

尝试canCancelContentTouches设置scrollViewtoNOdelaysContentTouchesto YES

编辑:

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

如果用户点击-n-signView按住(大约 0.3-0.5 秒),则视图的touchesBegan:方法被触发,并且从那一刻开始的所有事件都将被调用,signView直到touchesEnded:被调用。

如果用户快速滑动槽signView然后UIScrollView接管。

由于您已经实现UIView了方法的子类化,touchesBegan:也许您可​​以以某种方式向用户表明您的应用程序已准备好让他签名(“绿灯”等效)。

您也可以使用touchesEnded:来关闭此绿灯

signImageView如果您添加as subViewof signView(而不是 to )并在触发customScrollView时隐藏它可能会更好)。touchesBegan:您将添加signView到您添加现有代码customScrollview的同一位置。signImageView

有了这个,你可以实现那个地方实际上只有一个subView(为了更好的触摸传递效率。你可以通过取消隐藏来实现绿灯效果signImageViewtouchesBegan:/touchesEnded:

如果此应用程序行为(0.3-0.5 秒延迟)是不可接受的,那么您还需要子类化UIScrollView. Vignesh 的覆盖UIScrollView's的方法touchesShouldBegin:可能会派上用场。在那里,您可能会检测到触摸是否发生signView并立即将其传递给该视图。

于 2012-03-05T13:50:23.060 回答
3

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

于 2012-03-05T13:48:56.973 回答
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
  }
}
于 2017-10-25T05:57:44.080 回答