我希望我的MKMapView尽可能地缩放"用户位置"和注释.地图已经显示了两者,但缩小到了整个国家.我怎样才能做到这一点?
我不知道为什么Annotation和Pin没有动画.
我的代码:
//Coords User
CLLocationCoordinate2D user_location;
user_location.latitude = mapView.userLocation.location.coordinate.latitude;
user_location.longitude = mapView.userLocation.location.coordinate.longitude;
//Coords Annotation
CLLocationCoordinate2D club_location;
club_location.latitude = [self.clubInfo.latitude doubleValue];
club_location.longitude = [self.clubInfo.longitude doubleValue];
MKMapPoint userPoint = MKMapPointForCoordinate(user_location);
MKMapPoint annotationPoint = MKMapPointForCoordinate(club_location);
MKMapRect userRect = MKMapRectMake(userPoint.x, userPoint.y, 0, 0);
MKMapRect annotationRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0);
MKMapRect unionRect = MKMapRectUnion(userRect, annotationRect);
MKMapRect unionRectThatFits = [mapView mapRectThatFits:unionRect];
[mapView setVisibleMapRect:unionRectThatFits animated:YES];
// Add an annotation
MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
annotation.coordinate = club_location;
annotation.title = self.clubInfo.clubName;
annotation.subtitle = @"Pin!";
[mapView addAnnotation:annotation]; // This was missing
[mapView selectAnnotation:annotation animated:YES];
Run Code Online (Sandbox Code Playgroud)

日志:
userRect: {{134217728.0, 134217728.0}, {0.0, 0.0}}
annotationRect: {{99775488.0, 152579328.0}, {0.0, 0.0}}
unionRect: {{99775488.0, 134217728.0}, {34442240.0, 18361600.0}}
mapView.visibleMapRect: {{96025087.6, 116070015.1}, {41943040.7, 54657025.8}}
Run Code Online (Sandbox Code Playgroud)
如果我理解得很好,您希望这两个注释在最大可能缩放时可见.我发现这个解决方案不需要任何计算.
// You have coordinates
CLLocationCoordinate2D user = ...;
CLLocationCoordinate2D annotation = ...;
// Make map points
MKMapPoint userPoint = MKMapPointForCoordinate(user);
MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation);
// Make map rects with 0 size
MKMapRect userRect = MKMapRectMake(userPoint.x, userPoint.y, 0, 0);
MKMapRect annotationRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0);
// Make union of those two rects
MKMapRect unionRect = MKMapRectUnion(userRect, annotationRect);
// You have the smallest possible rect containing both locations
MKMapRect unionRectThatFits = [mapView mapRectThatFits:unionRect];
[mapView setVisibleMapRect:unionRectThatFits animated:YES];
Run Code Online (Sandbox Code Playgroud)
CoreLocation和MapKit结构很糟糕.
对于以后来这里的任何人:这样做的最短方法是(iOS7+):
假设您有一个 @propertyMKMapView *mapView和一个MKPointAnnotation *theAnnotation, 调用:
[self.mapView showAnnotations:@[theAnnotation, self.mapView.userLocation] animated:NO];
Run Code Online (Sandbox Code Playgroud)
现在,如果过早调用(即何时self.mapView.userLocation尚未设置),这可能会导致一些问题。如果是这样,您可以调用viewWillAppear:
[self.mapView.userLocation addObserver:self forKeyPath:@"location" options:0 context:NULL];
Run Code Online (Sandbox Code Playgroud)
然后,实施:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"location"]) {
[self.mapView showAnnotations:@[theAnnotation, self.mapView.userLocation] animated:NO];
}
}
Run Code Online (Sandbox Code Playgroud)
这样你就确定它已经设置好了。不要忘记在 viewWillDisappear 处移除观察者:
[self.mapView.userLocation removeObserver:self forKeyPath:@"location"];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5334 次 |
| 最近记录: |