由用户操作或程序调用的MKMapView regionDidChangeAnimated

时间:2011-11-10 08:15:19

标签: objective-c annotations mkmapview


我有一个MKMapView,里面有一些注释。现在,每当区域发生变化时,我都会加载新的注释。这工作正常,但如果某些注释靠近地图视图的边界并点击它,则会弹出注释信息窗口并且mkmapview区域移动一点(这样它可以很好地显示窗口),但问题是还调用了regionDidChangeAnimated并重新加载了我的所有注释,当然还隐藏了信息窗口。我知道你可以在重新加载时再次点击注释,但是对于用户来说它似乎已经破坏了,而且当你不需要时你也会重新加载注释。
有没有办法检查是否由于用户操作或以编程方式调用regionDidChangeAnimated?
感谢。

3 个答案:

答案 0 :(得分:5)

当点击地图视图边缘附近的注释并移动地图以适合标注时,事件序列为:

  1. regionWillChangeAnimated被称为
  2. didSelectAnnotationView被称为
  3. regionDidChangeAnimated被称为
  4. 使用两个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;
    }
    

答案 1 :(得分:1)

您是否删除了所有注释并在regionDidChangeAnimated方法中添加了新注释?我认为更强大的解决方案是使用字典和一些唯一标识符(不会更改,数据库ID等)跟踪您添加到地图中的所有注释。然后在您的regionDidChangeAnimated方法中,您只添加实际的新方法,也可以删除区域外的注释。

答案 2 :(得分:0)

您可能会发现将新注释加载到UIGestureRecognizer是一种更好的体验,因此当您知道用户手动滚动地图这一事实时,您只会加载新的注释。这也可以防止设备旋转时重新加载。请参阅Jano在determine if MKMapView was dragged/moved的回答。