如何判断MKMapView上的哪些区域更改事件是MKMapView的编程或用户拖动?

时间:2010-06-10 01:09:10

标签: iphone cocoa-touch mapkit mkmapview

我有MKMapView注册代表,因此我可以收听区域更改事件(特别是regionDidChangeAnimated)。我正在寻找一种可靠的方法来判断区域更改事件是由用户拖动地图还是来自程序setRegion:请求的结果。

我的目标是让应用程序根据位置跟踪自动居中地图,除非用户手动平移地图,此时自动居中将关闭。因此,我正在调用setRegion:以适当地重新定位地图视图,但我很难确定对代理的结果regionDidChangeAnimated:调用是编程还是来自用户泛。我已经尝试过一起攻击某些东西,但是当用户开始平移时,我会继续遇到竞争条件,就像位置更新一样。

1 个答案:

答案 0 :(得分:5)

我用布尔值修复了这个问题,该布尔值跟踪代码触发的区域/中心变化。不是最优雅的解决方案,但它就像一个魅力。很遗憾UIMapView不是从UIScrollView派生的。

INIT:

regionChangeFromCode = FALSE;

按钮操作:

-(IBAction) butCenterPressed:(id)sender
{   
    butCenter.selected = !butCenter.selected;       
    if(butCenter.selected)  
        [self setCenter];
}

设置中心:

-(void) setCenter
{
    regionChangeFromCode = TRUE; //before setCenterCoordinate, otherwise this is FALSE in regionWillChangeAnimated
    [theMap setCenterCoordinate:[self calcCenter]]; //this could also be [theMap setRegion]. Works the same
}

和地图委托:

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    if(!regionChangeFromCode) //so a user did it
    {
        if(butCenter.selected)
            butCenter.selected = FALSE;
    }
    regionChangeFromCode = FALSE;
}

除此之外,我还有一个更新循环,用于更新位置并调用setCenter。选择按钮后,地图中心将跟随,否则中心将保持不变。