我有自定义滚动视图,子类化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而不是自定义滚动视图,但在这种情况下,当我开始滚动时,视图仍然粘在固定位置。 (在这种情况下,它的框架保持固定)
答案 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
}
}