2012-08-31 3 views
3

Je cherchais un bon tutoriel sur l'ajout d'une superposition d'image pour Mapkit en C# Monotouch.Incrustation d'image MonoTouch Mapkit

J'ai trouvé beaucoup d'exemples de superposition pour des cercles ou des polygones colorés. Mais je veux charger un PNG sur le dessus de mes cartes. Je viens de MonoAndroid et l'ai fait là, mais j'ai besoin de transférer mon programme sur iOS.

Même un exemple objectif en C aiderait, mais Mono serait meilleur.

Répondre

2

J'ai fini par télécharger un code C objectif natif et à peu près juste le convertir en C#. Les noms des fonctions sont très similaires, les références de l'API Xamarin Documentation est très utile.

Là où quelques bosses difficiles je suis tombé autour du délégué de l'application, et comment elle est traitée différemment en C# à l'objectif C.

Voici les deux fonctions les plus difficiles à convertir et ma solution:

1) les fonctions de dessin dans la classe de superposition de cartes

public override void DrawMapRect (MKMapRect mapRect, float zoomScale, CGContext ctx) 
    { 
     InvokeOnMainThread(
      () => 
      { 
      UIImage image = UIImage.FromFile(@"indigo_eiffel_blog.png"); 

       DrawImgRotated(image, 0, ctx); 
      } 
     ); 
    } 

    public void DrawImgRotated(UIImage image, float rotDegree, CGContext c) 
    { 
     c.SaveState(); 

     CGImage imageRef = image.CGImage; 

     //loading and setting the image 
     MKMapRect theMapRect = ((MapOverlay)this.Overlay).BoundingMapRect;//MKMapRect theMapRect = [self.overlay boundingMapRect]; 
     RectangleF theRect = RectForMapRect(theMapRect); 

     //we need to flip and reposition the image 
     c.ScaleCTM(1.0f, -1.0f); 
     c.TranslateCTM(-theRect.Width/8,-theRect.Height); 

     // Proper rotation about a point 
     var m = CGAffineTransform.MakeTranslation(-theRect.Width/2,-theRect.Height/2); 
     m.Multiply(CGAffineTransform.MakeRotation(DegreesToRadians(rotDegree))); 
     m.Multiply(CGAffineTransform.MakeTranslation(theRect.Width/2,theRect.Height/2)); 
     c.ConcatCTM(m); 

     c.DrawImage(theRect, imageRef); 

     c.RestoreState(); 
    } 

et 2) la fonction mapRect englobante dans ma classe mapOverlay primordiale MKOverlay. Oui, la position est codée en dur, je travaille sur l'unité de conversion atm mais ce sont les coordonnées correctes pour dessiner l'image comme dans le code c de l'échantillon que j'ai utilisé.

public MKMapRect BoundingMapRect 
    { 
     [Export("boundingMapRect")] 
     get 
     { 
      var bounds = new MKMapRect(1.35928e+08, 9.23456e+07,17890.57, 26860.05); 
      return bounds; 
     } 

    } 

Le code source du projet Objectif C I est converti ici: https://github.com/indigotech/Blog-MKMapOverlayView

Xamarin documentation de référence API: http://iosapi.xamarin.com/

0

La façon dont vous voulez vous y prendre dépendra du type d'image que vous voulez superposer. Si c'est juste assez petit, vous devriez pouvoir vous en sortir en utilisant une seule image. Cependant, si elle couvre une plus grande zone que celle utilisée, attendez-vous à pouvoir zoomer dessus, vous devrez peut-être la diviser en plusieurs cases pour de meilleures performances.

Voici quelques autres questions sur Stack Overflow qui pourrait répondre pour vous:

How do I create an image overlay and add to MKMapView?

iPhone - Image overlay MapKit framework?

WWDC2010 de Voir Apple exemple de code tilemap https://github.com/klokantech/Apple-WWDC10-TileMap (posté à GitHub par quelqu'un)

Rien de tout cela n'a rien à voir avec Mono, mais vous devriez pouvoir le convertir ...