web-dev-qa-db-ja.com

MKMapViewでユーザーの位置を中心に半径1000mの円を描きます

(iOS 5およびXcode 4.2を使用)

MKMapViewがあり、ユーザーの場所を中心に半径1000mの円を描きたい。

表面的には、 mapView:viewForAnnotation: マップビューデリゲートメソッドを実装し、ユーザーの場所にカスタムMKAnnotationViewを追加することが完璧なソリューションのようです。次のようになります。

- (MKAnnotationView *)mapView:(MKMapView *)mapView
            viewForAnnotation:(id <MKAnnotation>)annotation
{
    // If it's the user location, return my custom MKAnnotationView.
    if ([annotation isKindOfClass:[MKUserLocation class]]) {
        return myCustomAnnotationView;
    } else {
        return nil;
    }
}

ただし、マップの注釈は、マップをズームインおよびズームアウトしても拡大縮小されません。

そこで、 MKCircle クラスを使用して、オーバーレイを追加してみました(オーバーレイは地図に合わせて拡大するため)、その座標をlocationManger/mapビューデリゲートからの最新の座標に設定しましたただし、MKCircleの coordinate property は読み取り専用なので、オーバーレイを削除してから、ユーザーが移動するたびに新しいオーバーレイを追加する必要があります。目立つフリッカーが発生する原因。

マップビューの拡大縮小に合わせて、アノテーションをシームレスに拡大縮小する方法はありますか?または、ユーザーの場所の変更に合わせてオーバーレイをシームレスに移動する良い方法はありますか?

私はあなたの助けにとても感謝します:)

58
Jon Cox

カスタムオーバーレイを試してください。これをviewDidLoadに追加します。

MKCircle *circle = [MKCircle circleWithCenterCoordinate:userLocation.coordinate radius:1000];
[map addOverlay:circle];

userLocationは、MKUserLocationAnnotationをプロパティとして保存することで取得できます。次に、実際に円を描くには、これをマップビューのデリゲートに配置します。

- (MKOverlayRenderer *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay
{
    MKCircleRenderer *circleView = [[MKCircleRenderer alloc] initWithOverlay:overlay];
    circleView.strokeColor = [UIColor redColor];
    circleView.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.4];
    return circleView;
}
79
benwad

Swiftを使用したiOS 8.0の更新バージョン。

import Foundation
import MapKit

class MapViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate{
    var locationManager: CLLocationManager = CLLocationManager()

    @IBOutlet var mapView: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // We use a predefined location
        var location = CLLocation(latitude: 46.7667 as CLLocationDegrees, longitude: 23.58 as CLLocationDegrees)

        addRadiusCircle(location)
    }

    func addRadiusCircle(location: CLLocation){
        self.mapView.delegate = self
        var circle = MKCircle(centerCoordinate: location.coordinate, radius: 10000 as CLLocationDistance)
        self.mapView.addOverlay(circle)
    }

    func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
        if overlay is MKCircle {
            var circle = MKCircleRenderer(overlay: overlay)
            circle.strokeColor = UIColor.redColor()
            circle.fillColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.1)
            circle.lineWidth = 1
            return circle
        } else {
            return nil
        }
    }
}
46
vladCovaliov

Swift 3/Xcode 8はこちら:

func addRadiusCircle(location: CLLocation){
    if let poll = self.selectedPoll {
        self.mapView.delegate = self
        let circle = MKCircle(center: location.coordinate, radius: 10)
        self.mapView.add(circle)
    }
}

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    if overlay is MKCircle {
        let circle = MKCircleRenderer(overlay: overlay)
        circle.strokeColor = UIColor.red
        circle.fillColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.1)
        circle.lineWidth = 1
        return circle
    } else {
        return MKPolylineRenderer()
    }
}

その後、次のように呼び出します:

self.addRadiusCircle(location: CLLocation(latitude: YOUR_LAT_HERE, longitude: YOUR_LNG_HERE))
18
thexande

Apple Breadcrumbの例 のコードを使用してみてください

3
Shmidt

ベンワッドの答えが分からなかった。 つまり、ここではより明確な答えです

円を追加するのはとても簡単です。 MKMapViewDelegateに準拠

@interface MyViewController : UIViewController <MKMapViewDelegate>
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@end

ViewDidLoadで、円注釈を作成してマップに追加します。

CLLocationCoordinate2D center = {39.0, -74.00};

// Add an overlay
MKCircle *circle = [MKCircle circleWithCenterCoordinate:center radius:150000];
[self.mapView addOverlay:circle];

次に、mapView:viewForOverlay:を実装して、ビューを返します。

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{
    MKCircleView *circleView = [[MKCircleView alloc] initWithOverlay:overlay];
    [circleView setFillColor:[UIColor redColor]];
    [circleView setStrokeColor:[UIColor blackColor]];
    [circleView setAlpha:0.5f];
    return circleView;
}

ただし、ズームレベルに関係なく、円を常に同じサイズにしたい場合は、別の操作を行う必要があります。あなたが言うように、regionDidChange:animated:で緯度デルタを取得してから、新しい円を作成し(半径が幅に収まる)、古い円を削除して新しい円を追加します。

私からの注意:mapviewをView Controllerデリゲートに接続することを忘れないでください。そうでない場合、viewForOverlayは呼び出されません。

2
RealNmae
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay

iOS 4.0以降では非推奨です

0
e a

サークルを追加するのは簡単です。 MKMapViewDelegateに準拠します。以下の手順に従ってください、

ステップ1 :

 CLLocationCoordinate2D center= {self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude};
// Add an overlay
MKCircle *circle= [MKCircle circleWithCenterCoordinate:center radius: 20000];//your distance like 20000(like meters)
[myMapView addOverlay:circle];

ステップ2 :

 - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
 {
    MKCircleView *C_View = [[MKCircleView alloc] initWithOverlay:overlay];
    [C_View setFillColor:[UIColor lightGrayColor]];
    [C_View setStrokeColor:[UIColor blackColor]];
    [C_View setAlpha:0.5f];

    return C_View;
 }
0
Kupendiran iOS