我有一个MKMapView,里面有一些注释。现在,每当区域发生变化时,我都会加载新的注释。这工作正常,但如果某些注释靠近地图视图的边界并点击它,则会弹出注释信息窗口并且mkmapview区域移动一点(这样它可以很好地显示窗口),但问题是还调用了regionDidChangeAnimated并重新加载了我的所有注释,当然还隐藏了信息窗口。我知道你可以在重新加载时再次点击注释,但是对于用户来说它似乎已经破坏了,而且当你不需要时你也会重新加载注释。
有没有办法检查是否由于用户操作或以编程方式调用regionDidChangeAnimated?
感谢。
答案 0 :(得分:5)
当点击地图视图边缘附近的注释并移动地图以适合标注时,事件序列为:
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;
}
答案 1 :(得分:1)
您是否删除了所有注释并在regionDidChangeAnimated
方法中添加了新注释?我认为更强大的解决方案是使用字典和一些唯一标识符(不会更改,数据库ID等)跟踪您添加到地图中的所有注释。然后在您的regionDidChangeAnimated
方法中,您只添加实际的新方法,也可以删除区域外的注释。
答案 2 :(得分:0)
您可能会发现将新注释加载到UIGestureRecognizer是一种更好的体验,因此当您知道用户手动滚动地图这一事实时,您只会加载新的注释。这也可以防止设备旋转时重新加载。请参阅Jano在determine if MKMapView was dragged/moved的回答。