具有重叠视图的iOS MKMapView可以捕获选定的触摸/手势

法尔科

我正在尝试使用覆盖视图实现MKMapView,该视图绘制可编辑的多边形。因此,我需要有选择地捕获针对顶点的触摸手势,但允许其他触摸/手势通过,以便允许滚动和缩放地图。

那么,如何根据其坐标以编程方式将选定的触摸发送到地图或叠加层?

以下代码将其简化为一个简化方案:叠加视图的左侧为红色,右侧为蓝色。一侧应捕获触摸事件,而另一侧应允许地图交互。

地图和叠加层都是上的子视图SuperView

public sealed class SuperView: UIView
{
    readonly UIView map = new MapView();
    readonly UIView overlay = new Overlay();

    public SuperView()
    {
        AddSubview(map);
        AddSubview(overlay);
    }

    public override UIView HitTest(CGPoint point, UIEvent uievent)
    {
        return point.X < Frame.Width / 2 ? map : overlay;
    }
}

MapView派生自MKMapView,只有确保允许滚动:

public sealed class MapView: MKMapView
{
    public MapView() : base(UIScreen.MainScreen.Bounds)
    {
        ScrollEnabled = true;
    }
}

Overlay包含一个手势识别和可视化的两个区域:

public sealed class Overlay: UIView
{
    public Overlay() : base(UIScreen.MainScreen.Bounds)
    {
        BackgroundColor = new UIColor(0, 0, 0, 0);
        AddGestureRecognizer(new Recognizer());
    }

    public override void Draw(CGRect rect)
    {
        using (var context = UIGraphics.GetCurrentContext()) {
            context.SetFillColor(new CGColor(1, 0, 0, 0.25f));
            context.FillRect(new CGRect(rect.Left, rect.Top, rect.Width / 2, rect.Height));
            context.SetFillColor(new CGColor(0, 0, 1, 0.25f));
            context.FillRect(new CGRect(rect.Width / 2, rect.Top, rect.Width / 2, rect.Height));
        }
    }
}

识别器很简单:

public sealed class Recognizer: UIGestureRecognizer
{
    public override void TouchesBegan(NSSet touches, UIEvent evt)
    {
        Console.WriteLine("TouchesBegan");
        base.TouchesBegan(touches, evt);
    }

    public override void TouchesMoved(NSSet touches, UIEvent evt)
    {
        Console.WriteLine("TouchesMoved");
        base.TouchesMoved(touches, evt);
    }

    public override void TouchesEnded(NSSet touches, UIEvent evt)
    {
        Console.WriteLine("TouchesEnded");
        base.TouchesEnded(touches, evt);
    }

    public override void TouchesCancelled(NSSet touches, UIEvent evt)
    {
        Console.WriteLine("TouchesCancelled");
        base.TouchesCancelled(touches, evt);
    }
}

出现的屏幕如下所示:

在此处输入图片说明

触摸红色部分时,我希望与地图互动-这是行不通的。触摸蓝色部分时,我想查看手势识别器的控制台输出-确实可以工作。

什么不起作用:

  • 将覆盖图调整为仅屏幕的一半。

    在此人工示例中,这将有所帮助。但是在我的现实应用中,触摸与不触摸之间的区别更加复杂。

  • 将手势检测器添加到MapView

    由于每个手势识别器将以不确定的顺序接收触摸事件,因此您永远不会知道地图或手势检测器是否首先接收到触摸事件。因此,即使触摸不应该收到地图,地图也可能已经在滚动。

  • 覆盖HitTestPointInside

    我试图重写这些方法SuperViewMapView和/或Overlay但是它们要么没有被调用,要么似乎没有效果。至少我可以防止手势识别器收到红色区域的触摸。但是它没有达到预期的地图。也许我做错了。但似乎地图忽略了转发的触摸。

法尔科

我似乎已经解决了上述问题。显然,MKMapView不应该是一个子视图,但需要的是ViewViewController

public sealed class SuperView: UIViewController
{
    readonly UIView map = new MKMapView();
    readonly UIView overlay = new Overlay();

    public SuperView()
    {
        View = map;
        map.AddSubview(overlay);
    }
}

然后,Overlay视图获取HitTest实现:

    public override UIView HitTest(CGPoint point, UIEvent uievent)
    {
        return point.X < Frame.Width / 2 ? null : base.HitTest(point, uievent);
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ios标签栏触摸和触摸手势出现奇怪的错误

来自分类Dev

避免两个不同视图之间的触摸手势冲突

来自分类Dev

如何在Xamarin.iOS上处理3D触摸手势?

来自分类Dev

如何在带有触摸手势的IE桌面上选择文本?

来自分类Dev

拾取和弹出强制触摸手势有时不起作用

来自分类Dev

WPF是否具有触摸和保持手势?

来自分类Dev

如何在重叠的自定义文本视图中添加触摸事件/或手势 - swift ios

来自分类Dev

将触摸和手势从UIScrollview转发到视图

来自分类Dev

有没有一种方法可以为非触摸屏用户模拟手势?

来自分类Dev

Android中的全局触摸手势?

来自分类Dev

WinRT中的触摸手势(使用monogame)

来自分类Dev

GNOME 3.14中的多点触摸手势

来自分类Dev

禁用DrawerLayout的稀松触摸手势

来自分类Dev

是否可以在Synaptics触摸板上为多点触摸手势设置定义的区域?

来自分类Dev

X11上的Firefox-我可以在触摸屏上使用多点触摸手势吗?

来自分类Dev

带有手势识别器的 UITextView - 有条件地将触摸转发到父视图

来自分类Dev

iOS Pan手势

来自分类Dev

iOS保持手势

来自分类Dev

禁用滚动触摸,在其子视图上启用手势?

来自分类Dev

具有透明内容的ios 7视图与以前的视图重叠

来自分类Dev

确定多个视图中的哪个VIEW具有手势(双击,向左滑动,向右滑动等)?

来自分类Dev

SwiftUI如何启用具有手势的视图上的按钮

来自分类Dev

在没有智能手势的情况下使用华硕触摸板

来自分类Dev

如何在带有触摸屏的 LXQt 下使用多点触控手势?

来自分类Dev

iOS手势识别器未处理子视图

来自分类Dev

iOS手势识别器未处理子视图

来自分类Dev

检查哪个视图发送手势

来自分类Dev

如何在ubuntu 14.04中实现多点触摸手势

来自分类Dev

OnePlus One-屏幕关闭时触摸手势识别

Related 相关文章

  1. 1

    ios标签栏触摸和触摸手势出现奇怪的错误

  2. 2

    避免两个不同视图之间的触摸手势冲突

  3. 3

    如何在Xamarin.iOS上处理3D触摸手势?

  4. 4

    如何在带有触摸手势的IE桌面上选择文本?

  5. 5

    拾取和弹出强制触摸手势有时不起作用

  6. 6

    WPF是否具有触摸和保持手势?

  7. 7

    如何在重叠的自定义文本视图中添加触摸事件/或手势 - swift ios

  8. 8

    将触摸和手势从UIScrollview转发到视图

  9. 9

    有没有一种方法可以为非触摸屏用户模拟手势?

  10. 10

    Android中的全局触摸手势?

  11. 11

    WinRT中的触摸手势(使用monogame)

  12. 12

    GNOME 3.14中的多点触摸手势

  13. 13

    禁用DrawerLayout的稀松触摸手势

  14. 14

    是否可以在Synaptics触摸板上为多点触摸手势设置定义的区域?

  15. 15

    X11上的Firefox-我可以在触摸屏上使用多点触摸手势吗?

  16. 16

    带有手势识别器的 UITextView - 有条件地将触摸转发到父视图

  17. 17

    iOS Pan手势

  18. 18

    iOS保持手势

  19. 19

    禁用滚动触摸,在其子视图上启用手势?

  20. 20

    具有透明内容的ios 7视图与以前的视图重叠

  21. 21

    确定多个视图中的哪个VIEW具有手势(双击,向左滑动,向右滑动等)?

  22. 22

    SwiftUI如何启用具有手势的视图上的按钮

  23. 23

    在没有智能手势的情况下使用华硕触摸板

  24. 24

    如何在带有触摸屏的 LXQt 下使用多点触控手势?

  25. 25

    iOS手势识别器未处理子视图

  26. 26

    iOS手势识别器未处理子视图

  27. 27

    检查哪个视图发送手势

  28. 28

    如何在ubuntu 14.04中实现多点触摸手势

  29. 29

    OnePlus One-屏幕关闭时触摸手势识别

热门标签

归档