iOS:当SignaturePadView在UIScrollView中时,如何防止滚动?

时间:2016-01-28 16:00:57

标签: ios xamarin uiscrollview xamarin.ios

在我的移动程序用户界面中,我有一个SignaturePadView(继承自UIView的第三方组件),它位于UIScrollView之内。每当我尝试调试程序时,只要我将手指放在SignaturePadView内并开始签名,它所在的ScrollView就会捕获输入并滚动,而不允许我创建签名。当用户触摸UIScrollView内部时,无论如何都禁用SignaturePadView的滚动功能。

我尝试过两件事:

  1. ExclusiveTouch上将SignaturePadView设为true。对于这个,看起来ScrollView在检查ExclusiveTouch之前捕获输入。
  2. UIScrollView进行子类化并覆盖TouchesShouldBegin以关闭滚动。这允许我检查inContentView参数以查看它是否为SignaturePadView类型。这有两个问题:首先,SignaturePadView中的子视图返回到inContentView而不是SignaturePadView。其次,TouchesEnd并不总是触发,允许我在用户完成签名后重新打开滚动。
  3. 此时此刻,我正在寻找任何帮助。我是Xamarin和iOS开发的新手,最后一件事就是阻止我完成我的项目。

1 个答案:

答案 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方法。