【问题标题】:iOS: How do I prevent scrolling when a SignaturePadView is within a UIScrollView?iOS:当 SignaturePadView 在 UIScrollView 中时,如何防止滚动?
【发布时间】:2016-02-01 23:31:20
【问题描述】:

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

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

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

目前,我正在寻求任何可以得到的帮助。我是 Xamarin 和 iOS 开发的新手,最后一件事让我无法完成我的项目。

【问题讨论】:

  • 如果你不想让它滚动,你为什么要把它放在一个ScrollView中??
  • 当您将手指放在 SignaturePadView 内时,我不希望它滚动。否则,滚动视图中还有其他控件需要访问。

标签: ios xamarin uiscrollview xamarin.ios


【解决方案1】:

我在浏览了一些 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 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多