xamarin iOS:当SignaturePadView位于UIScrollView中时,如何防止滚动?

n3h0vuf2  于 4个月前  发布在  iOS
关注(0)|答案(2)|浏览(53)

在我的移动的程序的UI中,我有一个SignaturePadView(从UIView继承的第三方组件)。每当我试图调试程序时,只要我把手指放在SignaturePadView中并开始签名,它所在的ScrollView就会捕获输入并滚动,不允许我创建签名。当用户触摸SignaturePadView内部时,是否有任何方法禁用UIScrollView的滚动功能。
有两件事我尝试过但没有成功:
1.在SignaturePadView上将ExclusiveTouch设置为true。对于这个,看起来ScrollView在检查ExclusiveTouch之前捕获了输入。
1.子类化UIScrollView并覆盖TouchesShouldBegin以关闭滚动。这允许我检查inContentView参数以查看它是否属于SignaturePadView类型。这有两个问题:首先,SignaturePadView内部的子视图被返回到inContentView而不是SignaturePadView。其次,TouchesEnd并不总是被触发,允许我在用户完成签名后重新打开滚动。
在这个时候,我正在寻找任何帮助,我可以得到这一点。我是新的Xamarin和iOS开发,这最后一件事是阻止我完成我的项目。

wlp8pajw

wlp8pajw1#

我在翻阅了一些C2C代码后发现了这个问题。我必须子类化ScrollView并覆盖HitTest。对于将来遇到这个问题的任何人,这里是我使用的代码。
自定义滚动视图:

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

tktrz96b

tktrz96b2#

只是想弹出并更新这个线程。罗伯特仍然有正确的方式去做它,我会做每个人的青睐张贴从C -> Swift转换的代码。
享受和快乐狩猎!

class CustomScrollView: UIScrollView {

var deadAreas: [CGRect] = []

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    if deadAreas.contains(where: { $0.contains(point) }) {
        isScrollEnabled = false
    } else {
        isScrollEnabled = true
    }
    
    return super.hitTest(point, with: event)
}

字符串
}

相关问题