我有一个自定义滚动 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 仍固定在固定位置。 (在这种情况下,其框架保持固定)
最佳答案
尝试将canCancelContentTouches
的scrollView
设置为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
添加为subView
的signView
(而不是customScrollView
)并在触发touchesBegan:
时将其隐藏,则可能会更好。您应该在现有代码中添加signView
的位置添加customScrollview
到signImageView
。
这样,您可以实现该位置上实际上只有一个subView
(以实现更好的触摸传递效率。并且可以通过在signImageView
中取消隐藏touchesBegan:/touchesEnded:
来实现该绿灯效果。
如果此应用程序行为(延迟0.3-0.5s)是 Not Acceptable ,那么您还需要将UIScrollView
子类化。 Vignesh重写UIScrollView
的touchesShouldBegin:
的方法可以解决。在那里,您可能会检测到signView
中是否出现触摸,并立即将其传递给该 View 。