我必须将引脚放到可见的地图上,这样我就可以使用众所周知的代码行获得MKMapRect:
MKMapRect mapRect = MKMapRectNull;
for(id<MKAnnotation> annotation in [self.mapView annotations]){
if (![annotation isKindOfClass:[MKUserLocation class]]) {
MKMapPoint annotationPoint = MKMapPointForCoordinate([annotation coordinate]);
MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, delta, delta);
mapRect = MKMapRectUnion(mapRect, pointRect);
}
}
然后我得到MKCoordinateRegion
并设置:
MKCoordinateRegion region = MKCoordinateRegionForMapRect(newMapRect);
MKCoordinateRegion fitRegion = [self.mapView regionThatFits:region];
[self.mapView setRegion:fitRegion animated:animated];
因为我使用了两个状态(打开和关闭地图)close是地图不完全可见的地方(self.view
上的origin.y值是负数)我需要在方法&#时重绘rect 34; fitToAnnotations&#34;被称为我使用[self.mapView setNeedsLayout];
所以我可以得到正确的self.mapView.frame
(打开或关闭)。
现在,如果我使用此代码,与其他一些行,在iOS7中一切正常,但在iOS 7.1中,open-map-Region不同,显示没有引脚的大边缘区域,并且都安装在中心部分。
以下是我如何获得正确的区域来显示地图是满的还是半屏尺寸
MKMapRect newMapRect = mapRect;
if (mapFullScreen) {
newMapRect = [self.mapView mapRectThatFits:mapRect edgePadding:UIEdgeInsetsMake(200, 15, 30, 15)];
}else{
MKMapView *smallMap = [[MKMapView alloc] initWithFrame:self.homeViewController.tableView.tableHeaderView.frame];
newMapRect = [smallMap mapRectThatFits:mapRect edgePadding:UIEdgeInsetsMake(15, 60, 5, 60)];
smallMap = nil;
}
出了什么问题?
答案 0 :(得分:1)
我在iOS 7.1中面临同样的问题。
在我的应用程序中,问题是随机发生的,它可能取决于某些内部映射线程的执行速度。
对我来说,一个肮脏的黑客就是在调用方法之前在后台线程中添加一个[NSThread sleepForTimeInterval:1.0]来放大区域(类似于你描述的代码)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
//(generating annotions array here)
//ios 7.1 hack:
[NSThread sleepForTimeInterval:1.0];
dispatch_async(dispatch_get_main_queue(), ^{
[self zoomMapViewToFitAnnotations:self.mapView annotations:[annotationsToAddArray allObjects] animated:YES];
//(addding the generated annotations here)
});
});