I created a method as below to convert a CGRect to MapRect as below
- (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);
}
I did a little test.
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];
}
It works pretty well on 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
But, the result on iOS 4.3 is a little weird.
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
Something like this (Swift code) seems to work fine. In this case,
mapView
is of typeGMSMapView!
, somapView.frame
is of typeCGRect
.