我有一个自定义滚动 View ,子类为UIScrollView。我在viewcontroller nib文件中添加了滚动 View ,并将其类更改为CustomScrollView。现在,此自定义滚动 View (由xib创建)被添加为self.view上的 subview 。

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

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

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

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

最佳答案

尝试将canCancelContentTouchesscrollView设置为NO,将delaysContentTouches设置为YES

编辑:

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

如果用户点按n按住signView(大约0.3-0.5秒),则会触发view的touchesBegan:方法,并且从那一刻起所有事件都将转到signView,直到调用touchesEnded:

如果用户快速滑过signView,则UIScrollView会接管。

由于您已经实现了UIView子类,并实现了touchesBegan:方法,因此您可以以某种方式向用户表明您的应用已准备好供他签名(“绿灯”等效)。

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

如果将signImageView添加为subViewsignView(而不是customScrollView)并在触发touchesBegan:时将其隐藏,则可能会更好。您应该在现有代码中添加signView的位置添加customScrollviewsignImageView

这样,您可以实现该位置上实际上只有一个subView(以实现更好的触摸传递效率。并且可以通过在signImageView中取消隐藏touchesBegan:/touchesEnded:来实现该绿灯效果。

如果此应用程序行为(延迟0.3-0.5s)是 Not Acceptable ,那么您还需要将UIScrollView子类化。 Vignesh重写UIScrollViewtouchesShouldBegin:的方法可以解决。在那里,您可能会检测到signView中是否出现触摸,并立即将其传递给该 View 。

10-06 00:05