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

问题描述 投票:0回答:2

在我的移动程序的 UI 中,我有一个位于

SignaturePadView
内的
UIScrollView
(继承自 UIView 的第三方组件)。每当我尝试调试程序时,只要我将手指放入
SignaturePadView
并开始签名,它所在的 ScrollView 就会捕获输入并滚动,不允许我创建签名。当用户触摸
UIScrollView
内部时,是否可以禁用
SignaturePadView
的滚动功能。

我尝试过的两件事没有成功:

  1. ExclusiveTouch
    上将
    SignaturePadView
    设置为 true。对于这一点,ScrollView 似乎在检查
    ExclusiveTouch
    之前捕获输入。
  2. 子类化
    UIScrollView
    并覆盖
    TouchesShouldBegin
    以关闭滚动。这使我能够检查
    inContentView
    参数,看看它是否属于
    SignaturePadView
    类型。这有两个问题:首先,
    SignaturePadView
    内有子视图被返回到
    inContentView
    而不是
    SignaturePadView
    。其次,
    TouchesEnd
    并不总是触发,允许我在用户完成签名后重新打开滚动。

此时,我正在寻求任何可以获得的帮助。我是 Xamarin 和 iOS 开发的新手,最后一件事阻碍了我完成我的项目。

ios xamarin uiscrollview xamarin.ios
2个回答
2
投票

我在浏览了一些 Objective-C 代码后发现了这一点。我必须对

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);
    }
}

在我的视图控制器中:

_formView.DeadAreas.Add(signaturePadViewer.Frame);

就像魅力一样。原来我最初的错误是覆盖 Touch 方法而不是

HitTest
方法。


0
投票

只是想进来更新这个帖子。罗伯特仍然有正确的方法来解决这个问题,我将帮助大家发布从 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)
}

}

© www.soinside.com 2019 - 2024. All rights reserved.