我使用谷歌地图SDK for iOS。 我的地图上有标记,并且想要设置适当的缩放以使标记分离,并且标记应该一次在屏幕上可见。 我能够做到。我已经完成了使用逻辑,如果所有标记都可见,那么放大。但问题是地图相机正在急剧变化。我试了很多动画这个缩放,但我做不到。我尝试了animateToCameraPosition,animateToZoom和UIView动画方法。
- (BOOL)allCoordinatesVisibleWithLatitudes:(NSArray *)arrayOfLatitudes Longitudes:(NSArray *)arrayOfLongitudes
{
CLLocationCoordinate2D coordinate;
for(int i=0;i<arrayOfLatitudes.count;i++)
{
coordinate = CLLocationCoordinate2DMake([[arrayOfLatitudes objectAtIndex:i] floatValue], [[arrayOfLongitudes objectAtIndex:i] floatValue]);
if(![self.mapView.projection containsCoordinate:coordinate])
{
return NO;
}
}
return YES;
}
- (void)setZoomToHaveProperView
{
NSMutableArray * arrayOfLatitudes = [[NSMutableArray alloc] init];
NSMutableArray * arrayOfLongitudes = [[NSMutableArray alloc] init];
RS_SingleMatch * singleMatch = [[RS_SingleMatch alloc] init];
float zoom = 0.0;
// You may ignore this first for loop. it just takes coordinate of all markers in arrays.
for(int i=0;i<=self.userMatches.arrayOfMatches.count;i++)
{
if(i==self.userMatches.arrayOfMatches.count)
{
RS_Trip * userTrip = [[RS_Trip alloc] init];
[arrayOfLatitudes addObject:[NSNumber numberWithFloat:userTrip.fromLat]];
[arrayOfLongitudes addObject:[NSNumber numberWithFloat:userTrip.fromLon]];
if(self.segmentedControl.selectedSegmentIndex == 1)
{
[arrayOfLatitudes addObject:[NSNumber numberWithFloat:userTrip.toLat]];
[arrayOfLongitudes addObject:[NSNumber numberWithFloat:userTrip.toLon]];
}
}
else
{
singleMatch = [self.userMatches.arrayOfMatches objectAtIndex:i];
[arrayOfLatitudes addObject:[NSNumber numberWithFloat:singleMatch.fromLat]];
[arrayOfLongitudes addObject:[NSNumber numberWithFloat:singleMatch.fromLong]];
if(self.segmentedControl.selectedSegmentIndex == 1)
{
[arrayOfLatitudes addObject:[NSNumber numberWithFloat:singleMatch.toLat]];
[arrayOfLongitudes addObject:[NSNumber numberWithFloat:singleMatch.toLong]];
}
}
}
zoom = self.mapView.camera.zoom;
// if all coordinates are visible then zoom in
if([self allCoordinatesVisibleWithLatitudes:arrayOfLatitudes Longitudes:arrayOfLongitudes])
{
while ([self allCoordinatesVisibleWithLatitudes:arrayOfLatitudes Longitudes:arrayOfLongitudes])
{
zoom += 0.5;
[self.mapView setCamera:[GMSCameraPosition cameraWithTarget:self.mapView.camera.target zoom:zoom]];
[self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:self.mapView.camera.targetAsCoordinate zoom:zoom]];
}
}
}
我也尝试在if条件的while循环中反转设置mapview摄像机和动画摄像机的顺序。我花了3天时间做这件事。现在请求你的帮助。 提前谢谢。
答案 0 :(得分:13)
我认为这个问题是调用setCamera
会在没有动画的情况下捕捉到新的缩放级别 - 因此以下对animateToCameraPosition
的调用实际上不会对任何内容进行动画处理,因为相机已经是在那个位置。
但是,如果您删除了对setCamera
的调用,那么您可能最终会进入无限循环,因为对animateToCameraPosition
的调用实际上不会在一段时间之后更新相机(如动画播放),等循环的下一次迭代,标记仍然可见。
您需要做的是计算所需的最终缩放级别,然后拨打animateToCameraPosition
一次以将相机移动到那里。
我发布了一些代码,用于计算摄像机的中心和缩放级别,以适应这里的界限:
How to setRegion with google maps sdk for iOS?
因此,您可以使用类似的东西来计算适合您的标记到屏幕的相机位置。
答案 1 :(得分:11)
更简单的回答:
而不是
[self.mapView setCamera:[GMSCameraPosition cameraWithTarget:self.mapView.camera.target zoom:zoom]];
[self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:self.mapView.camera.targetAsCoordinate zoom:zoom]];
这样做:
[self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:[GMSCameraPosition cameraWithTarget:self.mapView.camera.target zoom:zoom]]];
适合我!
答案 2 :(得分:5)
GMSCameraPosition *newCameraPosition = [GMSCameraPosition cameraWithTarget:cordinate zoom:position.zoom];
dispatch_async(dispatch_get_main_queue(), ^{
[self.mapView animateToCameraPosition:newCameraPosition];
});
答案 3 :(得分:3)
此代码执行mapview相机到所选标记的平滑/动画重新定位。
- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker {
[mapView animateWithCameraUpdate:[GMSCameraUpdate setTarget:marker.position]];
mapView.selectedMarker = marker;
return YES;
}