webentwicklung-frage-antwort-db.com.de

Zeichnen Sie einen Kreis mit einem Radius von 1000 m um die Position des Benutzers in MKMapView

(Mit iOS 5 und Xcode 4.2)

Ich habe eine MKMapView und möchte einen Kreis mit einem Radius von 1000 m um den Benutzerstandort zeichnen.

Oberflächlich betrachtet scheint es eine perfekte Lösung zu sein, die Delegatmethode mapView: viewForAnnotation: map view zu implementieren und eine benutzerdefinierte MKAnnotationView für den Standort des Benutzers hinzuzufügen. Es würde ungefähr so ​​aussehen:

- (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;
    }
}

Anmerkungen auf der Karte werden jedoch nicht skaliert, wenn Sie die Karte vergrößern oder verkleinern.

Also habe ich versucht, eine Überlagerung hinzuzufügen (da Überlagerungen mit der Karte skalieren), indem ich die Klasse MKCircle verwendete und ihre Koordinaten auf die neuesten Koordinaten von meinem locationManger/map view-Delegaten einstellte. Da jedoch die Koordinateneigenschaft von MKCircle schreibgeschützt ist, muss ich die Überlagerung entfernen und dann jedes Mal eine neue hinzufügen, wenn sich der Benutzer bewegt. Verursacht ein merkliches Flackern, wenn es passiert.

Gibt es eine Möglichkeit, eine Anmerkungsskalierung nahtlos vorzunehmen, wenn die Kartenansicht ein- und ausgeblendet wird? Oder gibt es eine gute Möglichkeit, eine Überlagerung nahtlos mit Änderungen am Standort des Benutzers zu verschieben?

Ich wäre sehr dankbar für eure hilfe :)

58
Jon Cox

Versuchen Sie es mit einer benutzerdefinierten Überlagerung. Fügen Sie dies in viewDidLoad hinzu:

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

userLocation kann durch Speichern der MKUserLocationAnnotation als Eigenschaft abgerufen werden. Um den Kreis tatsächlich zu zeichnen, fügen Sie Folgendes in den Stellvertreter der Kartenansicht ein:

- (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

Eine aktualisierte Version für iOS 8.0 mit Swift.

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 hier:

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()
    }
}

Dann ruf wie folgt an:

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

Versuchen Sie, den Code aus Beispiel für Apple Breadcrumb zu verwenden

3
Shmidt

Ich verstand nicht, was ich antwortete. Hier ist also eine klarere Antwort :

Es ist ziemlich einfach, einen Kreis hinzuzufügen. An MKMapViewDelegate anpassen

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

Erstellen Sie in viewDidLoad eine Kreisanmerkung und fügen Sie sie der Karte hinzu:

CLLocationCoordinate2D center = {39.0, -74.00};

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

Implementieren Sie dann mapView: viewForOverlay:, um die Ansicht zurückzugeben.

- (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;
}

Wenn Sie jedoch möchten, dass der Kreis unabhängig von der Zoomstufe immer die gleiche Größe hat, müssen Sie etwas anderes tun. Wie Sie sagen, erhalten Sie in regionDidChange: animated: das LatitudeDelta, erstellen Sie dann einen neuen Kreis (mit einem Radius, der in die Breite passt), entfernen Sie den alten und fügen Sie den neuen hinzu.

Anmerkung von mir: Vergessen Sie nicht, mapview mit Ihrem View Controller-Delegaten zu verbinden. Andernfalls wird viewForOverlay nicht aufgerufen.

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

es ist veraltet seit iOS 4.0

0
e a

Es ist einfach, einen Kreis hinzuzufügen. An MKMapViewDelegate anpassen. folge den folgenden Schritten ,

Schritt 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];

Schritt 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