使自定义UIView响应双指触控板滚动手势(或鼠标滚轮)

6
我有一个使用C#编写的iPad应用程序,其中包含自定义UIView,可以通过触摸和Apple Pencil触摸进行输入。我正在尝试集成对轨迹板/鼠标间接(光标或“指针”)的支持。
我使用HoverGestureRecognizer使悬停功能正常工作。我使用普通的触摸Began/Moved/Ended/Cancelled事件,并检查.type == .indirectPointer,然后检查事件.ModifierFlags中是否设置了控制键修饰符,或者event.ButtonMask == secondary来使右键和控制键正常工作。
我花费了很多时间在Apple Developer网站上搜索文档,从这里开始并进行扩展:
- UIApplicationSupportsIndirectInputEvents 一些方式我尝试过,但都没有找到系统调用的API,当发生双指触控板滚动(或鼠标滚轮滚动)时。 (在另一个视图中,即ScrollView,当我进行双指滚动时,我可以获取ScrollView的滚动事件,因为这是iPadOS 13.4+中ScrollView的内置功能,但我的自定义视图不是ScrollView,它只是其中的一些可滚动区域。)
我尝试过以下事情:
  • UISwipeGestureRecognizer。没有为双指触控板滚动手势调用任何内容。
  • UIPanGestureRecognizer。没什么效果。
  • 子类化UIScrollView并添加UIScrollViewDelegate,只是为了看看它是否有效... 没有任何效果。
  • 子类化GestureRecognizer并添加,然后重写ShouldReceive(UIEvent evt),但从未被调用。
iPadOS 13.4+将触控板双指滚动手势转换为什么?我能以某种事件形式获得吗?这里提供的文档链接非常简略,但它提到了UIEvent.EventType.scroll,但没有说明系统何时在哪里调用我的任何事件类型方法。相当令人恼火。他们应该更清楚地解释。欢迎使用Swift或C#进行答案。
1个回答

6

好的,奇怪的是我认为我尝试过PanGestureRecognizer,但我一定设置错了。苹果的示例代码项目将指针交互集成到您的iPad应用程序中给出了答案(C#代码):

        panRecognizer = new UIPanGestureRecognizer(() => {
            Console.WriteLine("panned -- " + panRecognizer.VelocityInView(this));
        });
        panRecognizer.AllowedScrollTypesMask = UIScrollTypeMask.Continuous;
        AddGestureRecognizer(panRecognizer);

很高兴我弄明白了这个问题!


你好,谢谢!我遇到了同样的问题。我发现在设置UIScrollTypeMask时,触控板上的单指滚动仍然无法识别。你是否还需要做其他操作(或者你只对双指滚动感兴趣)? - SuPotter
在触控板上进行单指滚动只会移动触控板指针(“光标”),我认为你无法覆盖它。您可以使用悬停手势来查找视图中的位置。所以,是的,我认为除非您添加键盘修改器或其他内容,否则不支持单指触控板滚动。即使那样也可能不行。 - Jared Updike
这对我来说完美地运作了,谢谢!不过我希望有关于这个的文档。 - jangelsb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接