在我的移动程序 UI 中,我有一个位于 UIScrollView
中的 SignaturePadView
(继承自 UIView 的第 3 方组件)。每当我尝试调试程序时,只要我将手指放在 SignaturePadView
中并开始签名,它所在的 ScrollView 就会捕获输入并滚动,不允许我创建签名。当用户在 SignaturePadView
内部触摸时,是否可以禁用 UIScrollView
的滚动功能。
我尝试过的两件事没有成功:
- 在
SignaturePadView
上将ExclusiveTouch
设置为 true。对于这个,ScrollView 似乎在检查ExclusiveTouch
之前捕获输入。 - 子类化
UIScrollView
并覆盖TouchesShouldBegin
以关闭滚动。这允许我检查inContentView
参数以查看它是否属于SignaturePadView
类型。这有两个问题:首先,SignaturePadView
中有 subview 返回到inContentView
而不是SignaturePadView
。其次,TouchesEnd
并不总是触发,允许我在用户完成签名后重新打开滚动。
此时此刻,我正在寻求有关此问题的任何帮助。我是 Xamarin 和 iOS 开发的新手,最后一件事让我无法完成我的项目。
最佳答案
我在浏览了一些 Objective-C 代码后发现了它。我必须子类化 ScrollView
并覆盖 HitTest
。对于将来遇到此问题的任何人,这是我使用的代码。
自定义 ScrollView :
public class CustomScrollView : UIScrollView
{
public IList<CGRect> DeadAreas { get; } = new List<CGRect>();
public override UIView HitTest(CGPoint point, UIEvent uievent)
{
ScrollEnabled = DeadAreas.Any(x => x.Contains(point)) ? false : true;
return base.HitTest(point, uievent);
}
}
在我的 ViewController 中:
_formView.DeadAreas.Add(signaturePadViewer.Frame);
像魅力一样工作。原来我原来的错误是重写了 Touch 方法而不是 HitTest
方法。
关于iOS:当 SignaturePadView 在 UIScrollView 中时,如何防止滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35066206/