Sdílet prostřednictvím


Poznámky a překryvy v Xamarin.iOS

Aplikace, která sestavíme v tomto názorném postupu, je znázorněná níže:

Příklad aplikace MapKit

Začněme vytvořením nového prázdného projektu pro iOS a zadáním příslušného názvu. Začneme přidáním kódu do kontroleru zobrazení, který zobrazí MapView, a pak vytvoříme nové třídy pro mapDelegate a vlastní poznámky. Postupujte podle následujících kroků:

ViewController

  1. Přidejte následující obory názvů do ViewController:

    using MapKit;
    using CoreLocation;
    using UIKit
    using CoreGraphics
    
  2. Přidejte do třídy proměnnou MKMapView instance spolu s MapDelegate instancí. Brzy vytvoříme MapDelegate :

    public partial class ViewController : UIViewController
    {
        MKMapView map;
        MapDelegate mapDelegate;
        ...
    
  3. V metodě kontroleru LoadView přidejte MKMapView a nastavte ji na View vlastnost kontroleru:

    public override void LoadView ()
    {
        map = new MKMapView (UIScreen.MainScreen.Bounds);
        View = map;
    }
    

    Dále přidáme kód pro inicializaci mapy v metodě ViewDidLoad.

  4. V ViewDidLoad přidání kódu pro nastavení typu mapy zobrazte umístění uživatele a povolte přiblížení a posouvání:

    // change map type, show user location and allow zooming and panning
    map.MapType = MKMapType.Standard;
    map.ShowsUserLocation = true;
    map.ZoomEnabled = true;
    map.ScrollEnabled = true;
    
    
  5. Dále přidejte kód, který mapu zacentruje, a nastavte její oblast:

    double lat = 30.2652233534254;
    double lon = -97.73815460962083;
    CLLocationCoordinate2D mapCenter = new CLLocationCoordinate2D (lat, lon);
    MKCoordinateRegion mapRegion = MKCoordinateRegion.FromDistance (mapCenter, 100, 100);
    map.CenterCoordinate = mapCenter;
    map.Region = mapRegion;
    
    
  6. Vytvořte novou instanci MapDelegate a přiřaďte ji k sadě DelegateMKMapView. Znovu implementujeme MapDelegate krátce:

    mapDelegate = new MapDelegate ();
    map.Delegate = mapDelegate;
    
  7. Od iOSu 8 byste od uživatele měli požádat o autorizaci, aby používal svoji polohu, takže tuto možnost přidáme do naší ukázky. Nejprve definujte proměnnou CLLocationManager na úrovni třídy:

    CLLocationManager locationManager = new CLLocationManager();
    
  8. ViewDidLoad V této metodě chceme zkontrolovat, jestli zařízení, na kterém běží aplikace, používá iOS 8, a pokud se jedná, požádáme o autorizaci, když se aplikace používá:

    if (UIDevice.CurrentDevice.CheckSystemVersion(8,0)){
        locationManager.RequestWhenInUseAuthorization ();
    }
    
  9. Nakonec musíme upravit soubor Info.plist , abychom uživatelům doporučili důvod, proč si vyžádají umístění. V nabídce Zdroj souboru Info.plist přidejte následující klíč:

    NSLocationWhenInUseUsageDescription

    a řetězec:

    Maps Walkthrough Docs Sample.

ConferenceAnnotation.cs – třída pro vlastní poznámky

  1. Použijeme vlastní třídu pro poznámku s názvem ConferenceAnnotation. Do projektu přidejte následující třídu:

    using System;
    using CoreLocation;
    using MapKit;
    
    namespace MapsWalkthrough
    {
        public class ConferenceAnnotation : MKAnnotation
        {
            string title;
            CLLocationCoordinate2D coord;
    
            public ConferenceAnnotation (string title,
            CLLocationCoordinate2D coord)
            {
                this.title = title;
                this.coord = coord;
            }
    
            public override string Title {
                get {
                    return title;
                }
            }
    
            public override CLLocationCoordinate2D Coordinate {
                get {
                    return coord;
                }
            }
        }
    }
    

ViewController – Přidání anotace a překrytí

  1. ConferenceAnnotation Místo, kde ho můžeme přidat do mapy. Zpět v ViewDidLoad metodě ViewController, přidejte poznámku na středovou souřadnici mapy:

    map.AddAnnotations (new ConferenceAnnotation ("Evolve Conference", mapCenter));
    
  2. Chceme mít také překryvný hotel. Přidejte následující kód pro vytvoření MKPolygon pomocí souřadnic pro hotel poskytnutý hotel a přidejte ho do mapy voláním AddOverlay:

    // add an overlay of the hotel
    MKPolygon hotelOverlay = MKPolygon.FromCoordinates(
        new CLLocationCoordinate2D[]{
        new CLLocationCoordinate2D(30.2649977168594, -97.73863627705),
        new CLLocationCoordinate2D(30.2648461170005, -97.7381627734755),
        new CLLocationCoordinate2D(30.2648355402574, -97.7381750192576),
        new CLLocationCoordinate2D(30.2647791309417, -97.7379872505988),
        new CLLocationCoordinate2D(30.2654525150319, -97.7377341711021),
        new CLLocationCoordinate2D(30.2654807195004, -97.7377994819399),
        new CLLocationCoordinate2D(30.2655089239607, -97.7377994819399),
        new CLLocationCoordinate2D(30.2656428950368, -97.738346460207),
        new CLLocationCoordinate2D(30.2650364981811, -97.7385709662122),
        new CLLocationCoordinate2D(30.2650470749025, -97.7386199493406)
    });
    
    map.AddOverlay (hotelOverlay);
    

Tím se dokončí kód v souboru ViewDidLoad. Teď musíme implementovat naši MapDelegate třídu pro zpracování vytváření poznámek a překryvných zobrazení v uvedeném pořadí.

MapDelegate

  1. Vytvořte třídu, MapDelegate která dědí z MKMapViewDelegate a zahrne proměnnou annotationId , která se použije jako identifikátor opakovaného použití pro poznámku:

    class MapDelegate : MKMapViewDelegate
    {
        static string annotationId = "ConferenceAnnotation";
        ...
    }
    

    Máme tu jenom jednu poznámku, takže opětovné použití kódu není nezbytně nutné, ale je vhodné ho zahrnout.

  2. Implementujte metodu GetViewForAnnotation pro vrácení zobrazení pro ConferenceAnnotation použití conference.png image, která je součástí tohoto názorného postupu:

    public override MKAnnotationView GetViewForAnnotation (MKMapView mapView, NSObject annotation)
    {
        MKAnnotationView annotationView = null;
    
        if (annotation is MKUserLocation)
            return null;
    
        if (annotation is ConferenceAnnotation) {
    
            // show conference annotation
            annotationView = mapView.DequeueReusableAnnotation (annotationId);
    
            if (annotationView == null)
                annotationView = new MKAnnotationView (annotation, annotationId);
    
            annotationView.Image = UIImage.FromFile ("images/conference.png");
            annotationView.CanShowCallout = true;
        }
    
        return annotationView;
    }
    
  3. Když uživatel klepne na poznámku, chceme zobrazit obrázek zobrazující město Austin. Přidejte do MapDelegate obrázku následující proměnné a zobrazení, které ho zobrazí:

    UIImageView venueView;
    UIImage venueImage;
    
  4. Pokud chcete zobrazit obrázek při klepnutí na poznámku, implementujte metodu DidSelectAnnotation následujícím způsobem:

    public override void DidSelectAnnotationView (MKMapView mapView, MKAnnotationView view)
    {
        // show an image view when the conference annotation view is selected
        if (view.Annotation is ConferenceAnnotation) {
    
            venueView = new UIImageView ();
            venueView.ContentMode = UIViewContentMode.ScaleAspectFit;
            venueImage = UIImage.FromFile ("image/venue.png");
            venueView.Image = venueImage;
            view.AddSubview (venueView);
    
            UIView.Animate (0.4, () => {
            venueView.Frame = new CGRect (-75, -75, 200, 200); });
        }
    }
    
  5. Pokud chcete obrázek skrýt, když uživatel zruší výběr poznámky klepnutím kamkoli jinam na mapě, implementujte metodu DidDeselectAnnotationView následujícím způsobem:

    public override void DidDeselectAnnotationView (MKMapView mapView, MKAnnotationView view)
    {
        // remove the image view when the conference annotation is deselected
        if (view.Annotation is ConferenceAnnotation) {
    
            venueView.RemoveFromSuperview ();
            venueView.Dispose ();
            venueView = null;
        }
    }
    

    Teď máme kód pro poznámku. Zbývá jen přidat kód do MapDelegate zobrazení pro překryvný hotel.

  6. Přidejte následující implementaciGetViewForOverlay:MapDelegate

    public override MKOverlayView GetViewForOverlay (MKMapView mapView, NSObject overlay)
    {
        // return a view for the polygon
        MKPolygon polygon = overlay as MKPolygon;
        MKPolygonView polygonView = new MKPolygonView (polygon);
        polygonView.FillColor = UIColor.Blue;
        polygonView.StrokeColor = UIColor.Red;
        return polygonView;
    }
    

Aplikaci spusťte. Teď máme interaktivní mapu s vlastní anotací a překrytím! Klepněte na poznámku a zobrazí se obrázek Austinu, jak je znázorněno níže:

Klepněte na poznámku a zobrazí se obrázek Austinu.

Shrnutí

V tomto článku jsme se podívali na to, jak přidat poznámku k mapě a jak přidat překrytí pro zadaný mnohoúhelník. Také jsme si ukázali, jak do poznámek přidat podporu dotykového ovládání a animovat obrázek přes mapu.