Poznámky a překryvy v Xamarin.iOS
Aplikace, která sestavíme v tomto názorném postupu, je znázorněná níže:
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
Přidejte následující obory názvů do
ViewController
:using MapKit; using CoreLocation; using UIKit using CoreGraphics
Přidejte do třídy proměnnou
MKMapView
instance spolu sMapDelegate
instancí. Brzy vytvořímeMapDelegate
:public partial class ViewController : UIViewController { MKMapView map; MapDelegate mapDelegate; ...
V metodě kontroleru
LoadView
přidejteMKMapView
a nastavte ji naView
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.
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;
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;
Vytvořte novou instanci
MapDelegate
a přiřaďte ji k saděDelegate
MKMapView
. Znovu implementujemeMapDelegate
krátce:mapDelegate = new MapDelegate (); map.Delegate = mapDelegate;
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();
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 (); }
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
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í
ConferenceAnnotation
Místo, kde ho můžeme přidat do mapy. Zpět vViewDidLoad
metoděViewController
, přidejte poznámku na středovou souřadnici mapy:map.AddAnnotations (new ConferenceAnnotation ("Evolve Conference", mapCenter));
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ímAddOverlay
:// 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
Vytvořte třídu,
MapDelegate
která dědí zMKMapViewDelegate
a zahrne proměnnouannotationId
, 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.
Implementujte metodu
GetViewForAnnotation
pro vrácení zobrazení proConferenceAnnotation
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; }
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;
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); }); } }
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.Přidejte následující implementaci
GetViewForOverlay
: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:
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.