如何将CGRect转换为MapRect

我创建了一个方法,如下所示将CGRect转换为MapRect

- (MKMapRect)mapRectForRect:(CGRect)rect { CLLocationCoordinate2D topleft = [mapView convertPoint:CGPointMake(rect.origin.x, rect.origin.y) toCoordinateFromView:canvasView]; CLLocationCoordinate2D bottomeright = [mapView convertPoint:CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(rect)) toCoordinateFromView:canvasView]; MKMapPoint topleftpoint = MKMapPointForCoordinate(topleft); MKMapPoint bottomrightpoint = MKMapPointForCoordinate(bottomeright); return MKMapRectMake(topleftpoint.x, topleftpoint.y, bottomrightpoint.x - topleftpoint.x, bottomrightpoint.y - topleftpoint.y); } 

我做了一点测试。

  UIImageView *imageView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"heart.png"] imageByScalingProportionallyToSize:CGSizeMake(100, 100)]]; imageView.frame = CGRectMake(0, 0, 100, 100); imageView.center = [mapView convertCoordinate:mapView.centerCoordinate toPointToView:canvasView]; [canvasView addSubview:imageView]; CGRect rect = imageView.frame; for (int i = 0; i < 5; i ++) { NSLog(@"%f, %f, %f, %f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height); maprect = [self mapRectForRect:rect]; NSLog(@"%f, %f, %f, %f", maprect.origin.x, maprect.origin.y, maprect.size.width, maprect.size.height); region = MKCoordinateRegionForMapRect(maprect); rect = [mapView convertRegion:region toRectToView:canvasView]; } 

它在iOS 5上运行得很好:

110.000000,180.000000,100.000000,100.000000

78118912.000000,94811514.406252,52428800.000000,52428799.999997

110.000000,180.000000,100.000000,100.000000

78118912.000000,94811514.406252,52428800.000000,52428799.999997

110.000000,180.000000,100.000000,100.000000

78118912.000000,94811514.406252,52428800.000000,52428799.999997

110.000000,180.000000,100.000000,100.000000

78118912.000000,94811514.406252,52428800.000000,52428799.999997

110.000000,180.000000,100.000000,100.000000

78118912.000000,94811514.406252,52428800.000000,52428799.999997

但是,iOS 4.3的结果有点奇怪。

110.000000,180.000000,100.000000,100.000000

78118912.000000,94811514.406252,52428800.000000,52428799.999997

110.000000,174.263596,100.000000,101.746048

78118912.000000,91803986.406252,52428800.000000,53344231.999997

110.000000,166.962997,100.000000,104.330460

78118912.000000,87976370.406253,52428800.000000,54699207.999997

110.000000,157.400009,100.000000,108.272507

78118912.000000,82962610.406253,52428800.000000,56765975.999997

110.000000,144.297470,100.000000,114.581375

78118912.000000,76093106.406254,52428800.000000,60073639.999996

像这样的东西(Swift代码)似乎工作得很好。 在这种情况下, mapView的类型为GMSMapView! ,因此mapView.frame的类型为CGRect

 let mkMapSize = MKMapSize(width: Double(self.mapView.frame.width), height: Double(self.mapView.frame.height)) let mkMapPoint = MKMapPoint(x: Double(self.mapView.frame.origin.x), y: Double(self.mapView.frame.origin.y)) let mkMapRect = MKMapRect(origin: mkMapPoint, size: mkMapSize)