保持两个MKMapView显示相同的区域

时间:2011-05-07 16:27:57

标签: iphone ipad uiview mkmapview uitouch

在我的iPad应用程序中,我有两个相同尺寸的mapView,彼此相邻。我希望这些始终显示相同的区域。我现在使用regionDidChangeAnimated:delegate方法实现了这一点。

这并不总是那么好(有时缩放后区域不同)并且用户移动其中一张地图与另一张移动之间存在延迟。

有没有一种很好的方法来复制两个地图上的触摸,以便当用户平移和缩放时,它会同时在另一个地图上自动执行相同的操作?

我看到的一件事是创建一个UITouch对象,其位置值与正在移动的地图中正在装箱的位置值相同,但这不是一个好的解决方案。

有没有办法将一个UIView上的一组触摸复制到另一个(因为MKMapView是一个UIView)?

谢谢, 罗斯

3 个答案:

答案 0 :(得分:0)

尝试考虑使用一个静态变量和一个静态函数来控制缩放级别

答案 1 :(得分:0)

如果您没有为App Store开发,可以使用私有API来合成触摸 见http://cocoawithlove.com/2008/10/synthesizing-touch-event-on-iphone.html

您可以通过覆盖[UIApplication sendEvent:]来拦截,复制和修改触摸事件。 我没有测试它应该工作,虽然你不能提交App Store。

答案 2 :(得分:0)

您可以使用UIGestureRecognizer来帮助保持地图更加同步,因为用户正在操作其中一个地图。

例如,使用UIPanGestureRecognizer时,手势识别器动作处理程序将在用户平移地图时多次触发 - 与仅在平移完成时触发的regionDidChangeAnimated不同。

您需要为一个或两个地图添加手势识别器,并实现自定义手势处理程序方法。同时实现shouldRecognizeSimultaneouslyWithGestureRecognizer委托方法并返回YES,以便您的手势处理程序可以与地图一起使用。

示例:

//add the gesture handler to map(s)...
UIPanGestureRecognizer *pgr = [[UIPanGestureRecognizer alloc] 
    initWithTarget:self action:@selector(gestureHandler:)];
pgr.delegate = self;
[mapViewA addGestureRecognizer:pgr];
[pgr release];

//...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:
        (UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

- (void)gestureHandler:(UIGestureRecognizer *)gestureRecognizer
{
    [mapViewB setRegion:mapViewA.region animated:NO];
}

如果要为两者添加手势识别器,则需要为每个地图创建单独的实例(即,您无法将pgr添加到两个地图中)。您可能还需要/需要添加UIPinchGestureRecognizerUITapGestureRecognizer。您可以对所有识别器使用相同的处理程序方法。

我仍然会实施regionDidChangeAnimated,以防错过手势。