1

アップデート

MKMapView円の半径と中心座標を取得できる に円を描く必要があります。ただし、円を のサブビューにしMKMapViewて、マップ ビューを円の下にスクロールし、マップの移動に合わせて中心座標を更新し、マップのズームインとズームアウトに合わせて半径を更新できるようにしたいと考えています。

どうすればこれを達成できるか知っている人はいますか?


これは質問の元の文言です

MKMapView以下のコードを使用して、上に円を描きました。

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;

    self.region = [MKCircle circleWithCenterCoordinate:self.locationManager.location.coordinate radius:kViewRegionDefaultDistance];
    [self.mapView addOverlay:self.region];
}

- (MKOverlayPathRenderer *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay
{
    MKCircleRenderer *region = [[MKCircleRenderer alloc] initWithOverlay:overlay];
    region.strokeColor = [UIColor blueColor];
    region.fillColor = [[UIColor blueColor] colorWithAlphaComponent:0.4];
    return region;
}

これが機能し、マップ ビューに円が生成されます。ただし、マップ ビューをスクロールすると、円が一緒に移動します。円を固定したままにして、マップ ビューを円の下にスクロールさせたいと思います。

regionを作成するには、円の中心座標と半径を取得する必要があることに注意してください。そのため、UIView の半径をメートル単位で取得する方法がないため、MKMapView の上に UIView を単純に描画することはできません。

4

2 に答える 2

1

解決しました!

ステップ1:

を作成しUIView、サブビューとしてマップ ビューに追加しました。UIViewをマップ ビューの中央に配置したことに注意してください。centerCoordinateのプロパティを使用しMKMapViewて半径を計算するため、これは重要です。

self.region = [[UIView alloc] initWithFrame:centerOfMapViewFrame];
self.region.contentMode = UIViewContentModeRedraw;
self.region.userInteractionEnabled = NO;
self.region.alpha = 0.5;
self.region.layer.cornerRadius = widthOfView/2;
self.region.backgroundColor = [UIColor blueColor];

[self.mapView addSubview:self.region];

UIView下のイメージは、 にサブビューとして追加された円形を示していmapViewます。

ここに画像の説明を入力

ステップ2:

マップ ビューの中心座標と UIView のエッジ座標に基づいて半径を計算します。

CLLocationCoordinate2D edgeCoordinate = [self.mapView convertPoint:CGPointMake((CGRectGetWidth(self.region.bounds)/2), 0) toCoordinateFromView:self.region]; //self.region is the circular UIView

CLLocation *edgeLocation = [[CLLocation alloc] initWithLatitude:edgeCoordinate.latitude longitude:edgeCoordinate.longitude];
CLLocation *centerLocation = [[CLLocation alloc] initWithLatitude:self.mapView.centerCoordinate.latitude longitude:self.mapView.centerCoordinate.longitude];

CGFloat radius = [edgeLocation distanceFromLocation:centerLocation]; //is in meters

edgeLocation下のイメージは、およびの注釈を示していcenterLocationます。

ここに画像の説明を入力

于 2015-08-17T21:08:09.467 に答える