regionDidChangeAnimated

regionDidChangeAnimated

我有一个带有一些注释的MKMapView。现在,每次区域更改时,我都会加载新的注释。效果很好,但是如果某些注释位于地图视图的边框附近,然后点击它,则注释信息窗口会弹出,并且mkmapview区域会移动一点(以便它可以很好地显示该窗口),但是问题是还会调用regionDidChangeAnimated,它会重新加载我的所有注释,当然会隐藏信息窗口。我知道您可以在重新加载注释时再次点击该注释,但对于用户来说,它似乎已损坏,并且在不需要时也可以重新加载注释。
有什么方法可以检查是否由于用户操作或编程方式而调用了regionDidChangeAnimated?
谢谢。

最佳答案

轻按地图视图边缘附近的注释并移动地图以适合标注时,事件的顺序为:


regionWillChangeAnimated被称为
didSelectAnnotationView被称为
regionDidChangeAnimated被称为


使用两个BOOL ivar标志,您可以注意此顺序,并防止重新加载regionDidChangeAnimated中的注释。

例如:

-(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    regionWillChangeAnimatedCalled = YES;
    regionChangedBecauseAnnotationSelected = NO;
}

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    regionChangedBecauseAnnotationSelected = regionWillChangeAnimatedCalled;
}

-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    if (!regionChangedBecauseAnnotationSelected) //note "!" in front
    {
        //reload (add/remove) annotations here...
    }

    //reset flags...
    regionWillChangeAnimatedCalled = NO;
    regionChangedBecauseAnnotationSelected = NO;
}

10-08 19:09