如何判断MKMapView上的regionChange事件是编程还是用户拖动MKMapView?

Bri*_*ris 10 iphone cocoa-touch mapkit mkmapview

我有MKMapView一个注册代表,所以我可以听区域更改事件(特别是regionDidChangeAnimated).我正在寻找一种可靠的方法来判断区域更改事件是否是用户拖动地图或编程setRegion:请求的结果.

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

Ric*_*kyA 5

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

在里面:

regionChangeFromCode = FALSE;
Run Code Online (Sandbox Code Playgroud)

按钮动作:

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

设置中心:

-(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
}
Run Code Online (Sandbox Code Playgroud)

和地图委托:

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

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