Как конвертировать CGRect в MapRect - PullRequest
4 голосов
/ 12 февраля 2012

Я создал метод, описанный ниже, для преобразования 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: *+1007 *

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 * тысяча двадцать два * * +1023 * +78118912,000000, 94811514.406252, 52428800.000000, 52428799.999997

110.000000, 180.000000, 100.000000, 100.000000

78118912.000000, 94811514.406252, 52428800.000000, 52428 * * * * * *.немного странно.

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, 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*

78118912.000000, 87976370.406253, 52428800.000000, 54699207.999997

110.000000, 157.400009, 100.000000, 108.272507

78118912.000000, 114000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

78118912.000000, 76093106.406254, 52428800.000000, 60073639.999996

1 Ответ

0 голосов
/ 08 октября 2015

Что-то вроде этого (код 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)
...