触摸事件可以转发到MKMapView吗?

时间:2014-03-29 20:12:04

标签: ios mkmapview

我希望将地图视图显示为永久背景,而其他视图则显示在其上方(我要将顶部视图的alpha设置为0.9,以便地图在下方隐约可见并且在某些时候地图会被揭示出来。

我有一个容器视图,它位于地图视图的顶部,我想知道容器视图边界内发生的触摸事件是否可以传递到地图视图,以便滚动等等。这是一个草图项目,展示了该体系结构的一个示例。enter image description here

enter image description here

(容器视图位于地图视图的下半部分的顶部,容器视图和包含的View Controller的视图的alpha都是0,因此对于用户来说,地图在整个屏幕)。

可轻松将包含视图控制器视图或子视图控制器中发生的触摸事件转发到地图背景视图控制器。

如果我做的事情就像将触摸事件传递给地图视图一样

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    MapBackgroundViewController *parent = (MapBackgroundViewController *) self.parentViewController;
    [parent.mapView touchesBegan:touches withEvent:event];
}
然后没有任何反应。

有没有办法将触摸事件传递给地图视图,以便滚动等等?

2 个答案:

答案 0 :(得分:1)

是的,你可以这样做。

我所做的是子类UIView并覆盖hitTest:withEvent:,这样除非触及子视图,否则会传递触摸。像这样:

@implementation PassthroughView

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *view = [super hitTest:point withEvent:event];
    return view == self ? nil : view;
}

@end

然后我将此类分配给我的容器视图和IB中包含的视图控制器的主视图。因此,您仍然可以与包含的视图控制器的内容进行交互,但触摸容器本身会传递到地图。

答案 1 :(得分:0)

您可以将叠加层视图全部打包到一个容器视图中,然后在其中覆盖-pointInside:withEvent:以返回NO

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    return NO;
}

这会使视图有效“无法使用”。

或者,您也可以覆盖-hitTest:withEvent:以返回nil

简单地将userInteractionEnabled设置为NO将无法正常工作,因为点按仍会在视图中到达并被吞下。