该新版本的SDK开放了实时回调mapView滚动变化的回调(很良心,还是60帧的回调),无需开发者自己去监听相关属性的变化。
首先,我们要得到mapView实时的滚动回调:
//mapView是AGSMapView实例对象
__weak __typeof(self)weakSelf = self;
self.mapView.viewpointChangedHandler = ^{
NSLog(@"地图中心点:%@,拉伸层级:%@,旋转角度:%@",weakSelf.mapView.visibleArea.extent.center, @(weakSelf.mapView.mapScale),@(weakSelf.mapView.rotation));
};
然后就是确定是哪个地图跟随哪个地图联动,逻辑很简单,即非用户操作的那个地图跟随用户操作的那个地图联动,确定当前地图是否被用户操作,有一个代理回调(AGSMapView的touchDelegate回调):
-(void)geoView:(AGSGeoView*)geoView didTouchDownAtScreenPoint:(CGPoint)screenPoint
mapPoint:(AGSPoint*)mapPoint
completion:(void(^)(BOOL willHandleDrag))completion {
//此block回调YES,说明用户操作要被拦截,mapView不响应操作
//回调NO,即mapView响应操作
completion(NO);
//此处说明该geoView被用户操作了,写联动逻辑处理
}
最后,跟着联动的mapView代码设置移动、放大或者旋转:
[self.otherMapView setViewpoint:[[AGSViewpoint alloc] initWithCenter:self.mapView.visibleArea.extent.center scale:self.mapView.mapScale] duration:0 curve:AGSAnimationCurveLinear completion:^(BOOL finished) {
}];
跟随联动的代码不用设置动画时间,另外代码中的(AGSGeoView*)geoView即AGSMapView实例对象,利用了多态特性,假若联动逻辑代码写在一个控制器,可以根据geoView对象的比对来确定联动关系。