62

(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の座標プロパティは読み取り専用であるため、オーバーレイを削除してから、ユーザーが移動するたびに新しいオーバーレイを追加する必要があります。それが起こると、顕著なちらつきを引き起こします。

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

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

4

8 に答える 8

80

カスタムオーバーレイを試してください。これを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;
}
于 2012-02-10T11:55:46.637 に答える
48

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
        }
    }
}
于 2014-09-25T12:58:07.490 に答える
3

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

于 2012-01-29T21:01:15.797 に答える
2

ベンワッドの答えがわかりませんでした。したがって、より明確な答えは次のとおりです。

円を追加するのはとても簡単です。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: で latitudeDelta を取得してから、新しい円を作成し (幅に収まる半径で)、古い円を削除して新しい円を追加します。

私からの注意: mapview をビュー コントローラー デリゲートに接続することを忘れないでください。それ以外の場合、viewForOverlay は呼び出されません。

于 2014-12-21T17:19:32.720 に答える
0

円を追加するのは簡単です。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;
 }
于 2015-09-02T06:12:47.030 に答える
0
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay

iOS 4.0以降は非推奨です

于 2015-09-14T10:55:54.207 に答える