我有一个自定义 ScrollView ,它是 UIScrollView
的子类。我在我的 viewcontroller nib 文件中添加了一个 ScrollView ,并将其类更改为 CustomScrollView。现在,这个自定义 ScrollView (由 xib 制作)被添加为 self.view 的 subview 。
在这个 ScrollView 中,我有 3 个文本字段和 1 个从 xib 添加的 UIImageView
(名为 signImageView)。单击 UIImageView
(添加了一个 TapGestureRecogniser
)时,自定义 ScrollView 上会添加一个名为 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 上添加 signView 而不是自定义 ScrollView ,但在这种情况下,当我开始滚动时, View 仍然粘在固定位置。 (在这种情况下它的框架保持固定)
最佳答案
尝试将 scrollView
的 canCancelContentTouches
设置为 NO
并将 delaysContentTouches
设置为 YES
.
编辑:
我看到这里回答了类似的问题 Drag & sweep with Cocoa on iPhone (答案完全一样)。
如果用户点按并按住 signView
(大约 0.3-0.5 秒),则 View 的 touchesBegan:
方法将被触发,所有事件从那一刻开始到 signView
直到 touchesEnded:
被调用。
如果用户快速滑动 signView
,则 UIScrollView
接管。
由于您已经使用 touchesBegan:
方法实现了 UIView
的子类化,也许您可以以某种方式向用户表明您的应用已准备好供他签名('green光'等效)。
您还可以使用 touchesEnded:
关闭此绿灯。
如果将 signImageView
添加为 signView
的 subView
可能会更好(而不是 customScrollView
)并在触发 touchesBegan:
时隐藏它)。您可以在现有代码中添加 signImageView
的同一位置将 signView
添加到 customScrollview
。
这样你就可以实现那个地方实际上只有一个 subView
(为了更好的触摸传递效率。你可以通过 un- 实现 green light 效果在 touchesBegan:/touchesEnded:
signImageView
如果此应用程序行为(0.3-0.5 秒延迟) Not Acceptable ,那么您还需要子类化 UIScrollView
。 Vignesh 覆盖 UIScrollView
的 touchesShouldBegin:
的方法可能会派上用场。在那里,您可能会检测到触摸是否在 signView
中发生,并立即将其传递给该 View 。
关于ios - 触摸方法未在放置在 UIScrollView 中的 UIView 上调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9567599/