Objective c 将MKMapView区域设置为两个注释的中心

Objective c 将MKMapView区域设置为两个注释的中心,objective-c,mkmapview,mkannotation,Objective C,Mkmapview,Mkannotation,我正在寻找一些帮助,以根据当前位置注释和我设置的注释,完成一些关于在MKMapView上设置区域的代码 我想计算两者之间的距离,设置两者之间的中心,然后缩小,使两者都在视图中。对我来说,它在模拟器中似乎运行良好,但不幸的是userLocation.coordinate被固定在Apple HQ上。当我在一台设备上测试时,我看到了奇怪的行为。通常,如果两个注释在同一纬度上水平,它会缩小并设置适当的区域,但如果垂直距离更大,则无法正确缩小 我使用了找到的代码,并进行了一些编辑以满足我的需要: CLLo

我正在寻找一些帮助,以根据当前位置注释和我设置的注释,完成一些关于在MKMapView上设置区域的代码

我想计算两者之间的距离,设置两者之间的中心,然后缩小,使两者都在视图中。对我来说,它在模拟器中似乎运行良好,但不幸的是userLocation.coordinate被固定在Apple HQ上。当我在一台设备上测试时,我看到了奇怪的行为。通常,如果两个注释在同一纬度上水平,它会缩小并设置适当的区域,但如果垂直距离更大,则无法正确缩小

我使用了找到的代码,并进行了一些编辑以满足我的需要:

CLLocationCoordinate2D southWest = mapView.userLocation.coordinate;
CLLocationCoordinate2D northEast = southWest;

southWest.latitude = MIN(southWest.latitude, annotation.coordinate.latitude);
southWest.longitude = MIN(southWest.longitude, annotation.coordinate.longitude);

northEast.latitude = MAX(northEast.latitude, annotation.coordinate.latitude);
northEast.longitude = MAX(northEast.longitude, annotation.coordinate.longitude);

CLLocation *locSouthWest = [[CLLocation alloc] initWithLatitude:southWest.latitude longitude:southWest.longitude];
CLLocation *locNorthEast = [[CLLocation alloc] initWithLatitude:northEast.latitude longitude:northEast.longitude];

// This is a diag distance (if you wanted tighter you could do NE-NW or NE-SE)
CLLocationDistance meters = [locSouthWest distanceFromLocation:locNorthEast];

MKCoordinateRegion region;
region.center.latitude = (southWest.latitude + northEast.latitude) / 2.0;
region.center.longitude = (southWest.longitude + northEast.longitude) / 2.0;
region.span.latitudeDelta = meters / 111319.5;
region.span.longitudeDelta = 0.0;

MKCoordinateRegion savedRegion = [mapView regionThatFits:region];
[mapView setRegion:savedRegion animated:YES];

[locSouthWest release];
[locNorthEast release];
让我困惑的一件事是他说东北=西南


提前感谢所有获得帮助和意见的人:)

这篇博客文章可能会为您提供所需的见解


这篇博文可能会为您提供所需的洞察力


不要被前两行吓到,你可以忽略=符号的右边,因为它将被覆盖在下面

我认为问题在于:

region.span.longitudeDelta = 0.0;

不要被前两行吓到,你可以忽略=符号的右边,因为它将被覆盖在下面

我认为问题在于:

region.span.longitudeDelta = 0.0;

对于iOS7 forward,最好的方法是:

//来自API文档:
//-(void)showAnnotations:(NSArray*)注释动画:(BOOL)动画NS_可用(10_9,7_0);
[self.mapView showAnnotations:self.mapView.annotations动画:是];
对于我的个人项目(在iOS7之前),我只是在MKMapView类上添加了一个类别,以封装一个非常常见的操作的“可见区域”功能:将其设置为能够查看MKMapView实例上当前加载的所有注释(这包括您可能放置的管脚数量以及用户的位置)。结果是:

.h文件

#导入
@接口MKMapView(扩展)
-(void)ij_setVisibleDirectToFitalLoadedAnnotationsAnimated:(BOOL)动画;
-(void)ij_setVisibleRectToFitAnnotations:(NSArray*)注释动画:(BOOL)动画;
@结束
.m文件

#导入“MKMapView+Extensions.h”
@实现MKMapView(扩展)
/**
*将地图的当前可见部分更改为最适合地图上当前加载的所有注释的区域,并且可以选择设置更改的动画。
*
*@param animated是应使用动画执行的更改。
*/
-(无效)ij_setVisibleDirectToFitalLoadedAnnotationsAnimated:(BOOL)动画
{
MKMapView*mapView=self;
NSArray*annotations=mapView.annotations;
[self-ij_SetVisibleCrecttofitanotations:注释动画:动画];
}
/**
*将地图的当前可见部分更改为最适合提供的注释数组的区域,并且可以选择设置更改的动画。
数组中的所有元素必须符合协议,以便获取坐标以计算地图的可见区域。
*
*@param注释符合协议的元素数组,包含地图可见部分将被设置的位置。
*@param animated是否应使用动画执行更改。
*/
-(void)ij_setVisibleCrecttofitannotations:(NSArray*)注释动画:(BOOL)动画
{
MKMapView*mapView=self;
MKMapRect r=MKMapRectNull;
for(注释中的id a){
ZAssert([a conformsToProtocol:@协议(MKAnnotation)],@“错误:数组的所有元素必须符合MKAnnotation协议。元素(%@)未满足此要求”,a);
MKMapPoint p=MKMapPoint for坐标(a坐标);
//MKMapRectUnion执行两个矩形之间的并集,返回一个更大的包含这两个矩形的矩形(或者如果另一个为null,则仅返回一个)。这里我们为没有大小(点)的矩形执行此操作
r=MKMapRectUnion(r,MKMapRectMake(p.x,p.y,0,0));
}
[mapView SetVisibleMapect:r动画:动画];
}
@结束
如您所见,到目前为止,我添加了两种方法:一种用于将地图的可见区域设置为适合MKMapView实例上当前加载的所有注释的区域,另一种方法用于将其设置为任何对象数组。 因此,要设置mapView的可见区域,代码将非常简单:

//mapView实例
[self.mapView ij_setVisibleRecttoFitalLoadedAnnotationsAnimated:animated];

我希望它能帮助=)

对于iOS7 forward,最好的方法是:

//来自API文档:
//-(void)showAnnotations:(NSArray*)注释动画:(BOOL)动画NS_可用(10_9,7_0);
[self.mapView showAnnotations:self.mapView.annotations动画:是];
对于我的个人项目(在iOS7之前),我只是在MKMapView类上添加了一个类别,以封装一个非常常见的操作的“可见区域”功能:将其设置为能够查看MKMapView实例上当前加载的所有注释(这包括您可能放置的管脚数量以及用户的位置)。结果是:

.h文件

#导入
@接口MKMapView(扩展)
-(void)ij_setVisibleDirectToFitalLoadedAnnotationsAnimated:(BOOL)动画;
-(void)ij_setVisibleRectToFitAnnotations:(NSArray*)注释动画:(BOOL)动画;
@结束
.m文件

#导入“MKMapView+Extensions.h”
@实现MKMapView(扩展)
/**
*将地图的当前可见部分更改为最适合地图上当前加载的所有注释的区域,并且可以选择设置更改的动画。
*
*@param animated是应使用动画执行的更改。
*/
-(无效)ij_setVisibleDirectToFitalLoadedAnnotationsAnimated:(BOOL)动画
{
MKMapView*mapView=self;
NSArray*annotations=mapView.annotations;
[self ij_SetVisibleRecttoFitnot]
mapView.showAnnotations(mapView.annotations, animated: true)