在我的移动程序用户界面中,我有一个SignaturePadView
(继承自UIView的第三方组件),它位于UIScrollView
之内。每当我尝试调试程序时,只要我将手指放在SignaturePadView
内并开始签名,它所在的ScrollView就会捕获输入并滚动,而不允许我创建签名。当用户触摸UIScrollView
内部时,无论如何都禁用SignaturePadView
的滚动功能。
我尝试过两件事:
ExclusiveTouch
上将SignaturePadView
设为true。对于这个,看起来ScrollView在检查ExclusiveTouch
之前捕获输入。UIScrollView
进行子类化并覆盖TouchesShouldBegin
以关闭滚动。这允许我检查inContentView
参数以查看它是否为SignaturePadView
类型。这有两个问题:首先,SignaturePadView
中的子视图返回到inContentView
而不是SignaturePadView
。其次,TouchesEnd
并不总是触发,允许我在用户完成签名后重新打开滚动。此时此刻,我正在寻找任何帮助。我是Xamarin和iOS开发的新手,最后一件事就是阻止我完成我的项目。
答案 0 :(得分:1)
滚动浏览一些Objective-C代码后,我想出来了。我必须继承ScrollView
并覆盖HitTest
。对于将来遇到此问题的任何人,这是我使用的代码。
CustomScrollView:
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
方法。