• Programmazione Android
  • CORSI ONLINE
  • Web Agency

Logo

Corsi di programmazione web e mobile online
Navigation
  • Home
  • CORSI ONLINE
  • Tutorial Pratici
  • GUIDE COMPLETE
    • Corso completo di C
    • Corso videogame con Cocos2d
    • Programmazione Cocoa Touch
  • Sezioni
    • Libri e manuali
    • Tips & Tricks
    • Risorse utili
    • Strumenti di Sviluppo
    • Materiale OpenSource
    • Framework
    • Guide Teoriche
    • Guide varie
    • Grafica e Design
    • iPad
    • News
    • Video Tutorial
    • Windows Phone
  • Pubblicità
  • About
    • Chi siamo
    • Pubblicazioni
    • Collabora
    • Sostieni devAPP

T#028 – Utilizzo del MapKit (parte 1): Zoom e Annotation View personalizzate

By Luca Di Franco | on 27 Marzo 2010 | 46 Comments
Senza categoria

Eccomi al mio primo tutorial su DevAPP in cui vedremo i principali elementi che ci mette a disposizione il MapKit. In questa prima parte vedremo come zoommare sulla posizione dell’utente quando vengono acquisite le coordinate GPS e come aggiungere delle annotation view sulla nostra mappa. Premetto che io non ho l’abitudine di usare Interface Builder e che tutte le view che andremo ad utilizzare verranno create pragmaticamente.

Setup

Cominciamo col creare un nuovo progetto Window-Based in modo che vengano automaticamente generati solamente la window e l’application delegate. Una volta fatto ciò la prima cosa che dobbiamo fare è importare il framework MapKit: facciamo click secondario sul gruppo framework in Groups & Files, selezionando Add – Existing framework e scegliamo MapKit.framework. Importiamolo ora nel file nomeprogetto_prefix.pch che trovate nel gruppo Other Sources in modo che tutte le classi che andremo a creare potranno utilizzarlo. Il prefix header alla fine dovrà essere così:

#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import <MapKit/MapKit.h>
#endif

Creazione della map view

A questo punto ci ritroviamo con un’applicazione pronta ad utilizzare le mappe. Creiamo ora un nuovo UIViewController che chiameremo MapViewController. Cominciamo con l’aprire il file MapViewController.h e modifichiamolo in modo da adottare il protocollo MKMapViewDelegate.

@interface MapViewController : UIViewController <MKMapViewDelegate>

@end

Apriamo invece ora il file MapViewController.m e ridefiniamo la funzione loadView per poter creare la nostra map view.

- (void)loadView {
    self.title = @"Mappa";
    MKMapView *map= [[[MKMapView alloc] init] autorelease];
    map.delegate = self;
    map.showsUserLocation = YES;
    self.view = map;
}

In questo metodo allochiamo una nuova map view con abilitata la visualizzazione della posizione dell’utente, gli settiamo il controller stesso come delegate e visualizziamo la mappa assegnandola alla view del controller.

Se ora compiliamo ed eseguiamo l’applicazione l’unica cosa che vedremo sarà una schermata bianca (il colore di default della window). Questo perché non abbiamo ancora aggiunto questa vista nella finestra. Per far ciò apriamo il file di implementazione dell’application delegate e modifichiamo la funzione applicationDidFinishLaunching come segue:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    MapViewController *rootViewController = [[[MapViewController alloc] init] autorelease];
    UINavigationController navController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    [window addSubview:navController.view];
    [window makeKeyAndVisible];
}

Quello che facciamo è semplicemente creare un UINavigationController (il perché lo capiremo quando parleremo delle annotation) usando il nostro MapViewController come root controller e visualizzare la sua view nella finestra.

Se ora compiliamo vedremo la mappa e, dopo un breve lasso di tempo, il puntino blu della nostra posizione a Cupertino (se siamo sul simulatore).

Immagine 1

Zoommiamo sulla posizione dell’utente

Per far questo dobbiamo ridefinire un metodo del protocollo MKMapViewDelegate. Riapriamo quindi il file MapViewController e aggiungiamo il seguente metodo:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
    for (MKAnnotationView *annotationView in views) {
        if (annotationView.annotation == mapView.userLocation) {
            MKCoordinateSpan span = MKCoordinateSpanMake(0.3, 0.3);
            MKCoordinateRegion region = MKCoordinateRegionMake(mapView.userLocation.coordinate, span);
            [mapView setRegion:region animated:YES];
        }
    }
}

Questo metodo viene chiamato ogniqualvolta viene aggiunta una annotation alla mappa e quindi anche quando viene aggiunto il pallino blu relativo alla posizione dell’utente. Il codice scritto non fa altro che cercare tra le annotation view aggiunte se è presente quella relativa alla posizione dell’utente (mapView.userLocation). La regione che deve visualizzare la mappa viene settata in modo che in modo che sia centrata sulle coordinate dell’utente e in modo che la distanza nord-sud o ovest-est (dipende dal fatto che la mappa sia in landscape o portrait) sia di 0.3 gradi (stando alla documentazione 1 grado è circa 111km). Con la funzione setRegion:animated modifichiamo l’area visualizzata dalla mappa tramite un’animazione.

Se ora compiliamo ed eseguiamo l’applicativo vediamo che, quando viene acquisita la posizione dell’utente, la view viene modificata tramite un’animazione.

Immagine 2

Aggiunta di una annotation view personalizzata

Innanzitutto dobbiamo avere una annotation (ovvero un oggetto conforme al protocollo MKAnnotation) da visualizzare. Creiamo perciò una nuova classe (io l’ho chiamata GoogleHQAnnotation) che estende NSObject a cui facciamo adottare il protocollo MKAnnotation. Per esempio io ho creato l’annotazione relativa alla sede di Google a Mountain View in California. Modifichiamo il file .h in modo di avere il seguente codice:

@interface GoogleHQAnnotation : NSObject <MKAnnotation>  {
	CLLocationCoordinate2D coordinate;
}

@end

L’attributo coordinate è un attributo richiesto dal protocollo MKAnnotation e siamo quindi obbligati a dichiararlo. Passiamo ora al file di implementazione:

#import "GoogleHQAnnotation.h"

@implementation GoogleHQAnnotation

- (id)init {
    coordinate.longitude = -122.084095;
    coordinate.latitude = 37.422006;
    return [super init];
}

@synthesize coordinate;

- (NSString *)title {
    return @"Google HQ";
}

- (NSString *)subtitle {
    return @"(650) 253-0000‎";
}

@end

Si tratta di un semplice file di implementazione dove nella ridefinizione del metodo init ci limitiamo a settare le coordinate che puntano la sede di Google e che implementa i metodi richiesti dal protocollo (ovvero title, subtitle e coordinate). L’unica cosa strana è che abbiamo utilizzato la direttiva @synthesize senza aver dichiarato la property nel file di interfaccia. Questo non è un errore in quanto, adottando il protocollo MkAnnotation ereditiamo pure la proprietà dichiarata come @property (nonatomic, readonly) CLLocationCoordinate2D coordinate in esso definita.

Torniamo al MapViewController. Dobbiamo aggiungere l’annotazione alla map view. Possiamo quindi aggiungerla, per esempio, in fase di creazione nella loadView andando ad aggiungere la seguente riga di codice alla fine della funzione:

[map addAnnotation:[[[GoogleHQAnnotation alloc] init] autorelease]];

ricordandoci di importare il file .h della classe GoogleHQAnnotation.

A questo punto se eseguiamo l’applicativo già verrà creata la annotation view di default, ma noi ne vogliamo una personalizzata. Dobbiamo quindi ridefinire il metodo mapView:viewForAnnotation: ereditato dal protocollo MKMapViewDelegate. Questo metodo è quello a cui è delegata la creazione delle annotation view di ogni annotation. Lo implementeremo nel seguente modo:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation {
    if (annotation == mapView.userLocation) {
        return nil;
    }
    MKPinAnnotationView *pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"] autorelease];
    pinView.pinColor = MKPinAnnotationColorPurple;
    pinView.canShowCallout = YES;
    pinView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    pinView.animatesDrop = YES;
    return pinView;
}

Analizziamo ora il codice scritto. Nel blocco if controlliamo se l’annotazione di cui dobbiamo creare la view è quella relativa alla posizione dell’utente. In tal caso diamo come valore di ritorno nil che serve a far capire al sistema che per quella annotazione deve usare la annotation view di default. In caso contrario creiamo un pin da visualizzare avente le seguenti caratteristiche:

  • Colore viola (pinView.pinColor = MKPinAnnotationColorPurple)
  • Permette di visualizzare il callaut, ovvero il fumetto che appare quando tappate il pin (pinView.canShowCallout = YES)
  • Ha uno disclosure button sulla parte destra del callout (pinView.rightCalloutAccessoryView = …)
  • Appare tramite un’animazione (pinView.animatesDrop = YES)

La funzione termina con una return pinView che serve a far capire al sistema che quella annotazione verrà rappresentata sulla mappa dalla annotation view che abbiamo creato noi e non da quella di default.

Se ora compiliamo ed eseguiamo l’applicazione vedremo il nostro bel pin viola e se lo tappiamo apparirà il callout con titolo e sottotitolo. Ma c’è ancora qualcosa che manca. Infatti possiamo premere il disclosure button tutte le volte che vogliamo ma non accadrà niente. Per gestire questo evento dobbiamo ridefinire un metodo ereditato dal protocollo MKMapViewDelegate che viene invocato ogni volta che viene tappato un button presente in un qualsiasi callout. Aggiungiamo quindi il seguente codice al MapViewContoller:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
	[self.navigationController pushViewController:[[[UIViewController alloc] init] autorelease] animated:YES];
}

In pratica così facendo, quando premeremo il disclosure button verremo reindirizzati ad una nuova vista che sarà la base di partenza per la seconda parte tutorial.

Immagine 3

Se avete bisogno del codice lo potete tranquillamente scaricare comprensivo di commenti da google code.

Share this story:
  • tweet

Tags: annotationkitmappinTutorial Praticizoom

Recent Posts

  • Parte il percorso programmatori iOS in Swift su devACADEMY.it

    20 Dicembre 2017 - 0 Comment
  • Android, crittografare dati velocemente con Encryption

    24 Settembre 2018 - 0 Comment
  • Sql2o, accesso immediato ai database tramite Java

    3 Settembre 2018 - 0 Comment
  • Okio, libreria per ottimizzare l’input/output in Java

    27 Agosto 2018 - 0 Comment

Related Posts

  • Java 9, metodi Factory per Collection e mappe

    8 Novembre 2017 - 0 Comment
  • T#038 – Utilizzo del MapKit (parte 2): Annotation view calcolo della distanza e reverse geocoding

    5 Maggio 2010 - 48 Comments

Author Description

46 Responses to “T#028 – Utilizzo del MapKit (parte 1): Zoom e Annotation View personalizzate”

  1. 27 Marzo 2010

    fast

    ditemi che una delle parti del tutorial mapkit include l’utilizzo del magnetometro……

  2. 27 Marzo 2010

    Byteros

    Complimenti ancora, come al solito, se aveste scritto questo tutorial qualche mese fa sarebbe stato più semplice per me creare la mia app.

    Domanda:
    Come potrei fare per impostare lo span a 0.3 come avete fatto voi, però sul punto in cui l’utente fa il doppio tap? Ne ho bisogno per la mia app, devo trovare un modo per evitare di usare troppe volte le multigestures o il doppio tap per arrivare fino allo zoom desiderato.

    Un paio di dritte:

    //Rimuovere le annotazioni dalla mappa
    – (void) unloadAnnotation{
    [mappa removeAnnotations:mappa.annotations];
    }

    //Sostituire il pin leccalecca con una immagine personalizzato
    pin = [ [ MKAnnotationView alloc ] initWithAnnotation:annotation reuseIdentifier:identifier ];
    pin.image = [ UIImage imageNamed:@”image.png” ];

  3. 28 Marzo 2010

    Luca Di Franco

    @byteros. Per rispondere alla tua domanda direi che la prima cosa che mi viene in mente è subclassare MKMapView ridefinire i metodi touchesBegan:withEvent: e touchesEnded:withEvent:, inventarti una nuova gesture tipo il tap lungo 1-2 secondi che richiami la solita setRegion.
    L’annotazione con l’immagine invece voleva essere parte del secondo tutorial 🙁

    @fast. Per il momento non è prevista da parte mia la parte sul magnetometro per un semplice motivo: essendo dotato di un semplice iPod Touch non ho modo di testare in alcun modo la correttezza di quello che scrivo.

  4. 28 Marzo 2010

    Neo

    Tutorial fantastico!! Complimenti!! Attendo con ansia il seguito.. Grazie mille!!!

  5. 28 Marzo 2010

    Byteros

    Luca Di Franco :

    @byteros. Per rispondere alla tua domanda direi che la prima cosa che mi viene in mente è subclassare MKMapView ridefinire i metodi touchesBegan:withEvent: e touchesEnded:withEvent:, inventarti una nuova gesture tipo il tap lungo 1-2 secondi che richiami la solita setRegion.
    L’annotazione con l’immagine invece voleva essere parte del secondo tutorial

    Ops, scusa, ho rovinato la sorpresa 😀
    Voleva essere una dritta per gli utenti cmq, non per te ovviamente.

    Complimenti ancora.

  6. 15 Aprile 2010

    Davide

    te manca la * prima del “navController”…, foto numero 4….

  7. 15 Aprile 2010

    Luca Di Franco

    Piccolo grande errore dovuto ad una piccola modifica rispetto i sorgenti su google code . Grazie della segnalazione vedrò di modificarlo il prima possibile

  8. 20 Aprile 2010

    Massimo Oddolini

    Secondo voi è possibile utilizzando il map kit andare a ricercare 2 posizioni sulla mappa e calcolarne la distanza in km o m?

    Grazie mille.

  9. 20 Aprile 2010

    Luca Di Franco

    Col MapKit no. Ma si può con il framework CoreLocation. Ti consiglio di guardare sulla documentazione: classe “CLLocation” metodo “distanceFromLocation:”.

    Comunque mi hai dato un’ottima idea per la seconda parte del tutorial che mi sono appena messo a scrivere.

  10. 20 Aprile 2010

    Luca Di Franco

    Mi sono accorto ora che distanceFromLocation è per OS 3.2, per il 3.1 devi usare invece getDistanceFrom:

  11. 23 Aprile 2010

    amok

    Ottimo lavoro!!!

  12. 3 Maggio 2010

    Alen

    Domanda. ho provato ad estrapolare il codice per lo zoom pero non riesco a farlo funzionare.
    Il sim rieleva la mia posizione ma non mi zoomma…qualche consiglio??
    grazie
    ps complimenti davvero per la guida.

  13. 5 Maggio 2010

    Utilizzo del MapKit: Annotation view calcolo della distanza e reverse geocoding | devAPP

    […] Come possiamo notare la sostanziale differenza rispetto al codice scritto precedentemente sta nel fatto che non usiamo più MKPinAnnotationView ma utilizziamo una classe più generica (ad essere precisi la superclasse di MKPinAnnotationView) che ci permette di utilizzare un’immagine a nostra scelta caricandola dalle risorse dell’applicazione (in questo caso google.png) al posto del solito pin. Tutto questo lo facciamo con le righe 5 e 6 del precedente codice, mentre tutte le altre istruzioni sono già state spiegate nel tutorial precedente. […]

  14. 5 Maggio 2010

    Luca Di Franco

    Prova a controllare di aver settato il delegate della mappa (map.delegate = self;)

  15. 6 Maggio 2010

    sky1987

    Ciao a tutti. Ottimo tutorial! Volevo chiedervi un aiutino mi servirebbe visualizzare il tutto non all’avvio dell’applicazione bensì in una view accessibile cliccando su un tasto Mappa che ho inserito nella barra di navigazione della mia applicazione, come posso fare?

  16. 6 Maggio 2010

    giorgio

    @fast. Per il momento non è prevista da parte mia la parte sul magnetometro per un semplice motivo: essendo dotato di un semplice iPod Touch non ho modo di testare in alcun modo la correttezza di quello che scrivo.

    per il magnetometro puoi accederci tramite il metodo
    – (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading

    puoi comunque calcolare la direzione di marcia anche senza magnetometro, la fornisce sempre cllocationmanager tramite COURSE.

  17. 7 Maggio 2010

    Alen


    Luca Di Franco:

    Prova a controllare di aver settato il delegate della mappa (map.delegate = self;)

    Dove posso settarlo?per la view della mappa lo inserita tramite IB…e non in loadView…
    ho provato anche con il setCurrent location…definendo i region span…ma nn zooma.. arrrrgh

  18. 7 Maggio 2010

    sky1987


    sky1987:

    Ciao a tutti. Ottimo tutorial! Volevo chiedervi un aiutino mi servirebbe visualizzare il tutto non all’avvio dell’applicazione bensì in una view accessibile cliccando su un tasto Mappa che ho inserito nella barra di navigazione della mia applicazione, come posso fare?

    ho risolto inserendo il seguente codice:

    MapViewController *rViewController = [[[MapViewController alloc] init] autorelease];
    [self.navigationController pushViewController:rViewController animated:YES];

    nell’implementazione dell’IBAction del tasto Mappa che ho inserito nella barra di navigazione;
    Funziona perfettamente, l’unica cosa è che se faccio il release di rViewController, si blocca l’applicazione, sapreste spiegarmi il perchè??

  19. 7 Maggio 2010

    giorgio

    con che


    sky1987:


    sky1987:

    Ciao a tutti. Ottimo tutorial! Volevo chiedervi un aiutino mi servirebbe visualizzare il tutto non all’avvio dell’applicazione bensì in una view accessibile cliccando su un tasto Mappa che ho inserito nella barra di navigazione della mia applicazione, come posso fare?

    ho risolto inserendo il seguente codice:
    MapViewController *rViewController = [[[MapViewController alloc] init] autorelease];
    [self.navigationController pushViewController:rViewController animated:YES];
    nell’implementazione dell’IBAction del tasto Mappa che ho inserito nella barra di navigazione;
    Funziona perfettamente, l’unica cosa è che se faccio il release di rViewController, si blocca l’applicazione, sapreste spiegarmi il perchè??

    Con che errore? Prova a copiare l’errore dalla console.
    Se ti da un EXEC BAD ADDRESS è pechè probabilmente rilasci il tuo puntatore prima di usarlo

  20. 7 Maggio 2010

    giorgio


    Alen:


    Luca Di Franco:

    Prova a controllare di aver settato il delegate della mappa (map.delegate = self;)

    Dove posso settarlo?per la view della mappa lo inserita tramite IB…e non in loadView…
    ho provato anche con il setCurrent location…definendo i region span…ma nn zooma.. arrrrgh

    Nel
    viewDidLoad del tuo implementation controller


    MKMapView *map= [[[MKMapView alloc] initWithFrame:CGRectMake(0, 10, 320, 230)] autorelease];
    [map setDelegate:self]; ;
    [map setShowsUserLocation:YES];
    [self.view addSubview:map];
    self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"224.jpg"]];
    [super viewDidLoad];

    </code

  21. 7 Maggio 2010

    giorgio


    giorgio:

    con che


    sky1987:


    sky1987:

    Ciao a tutti. Ottimo tutorial! Volevo chiedervi un aiutino mi servirebbe visualizzare il tutto non all’avvio dell’applicazione bensì in una view accessibile cliccando su un tasto Mappa che ho inserito nella barra di navigazione della mia applicazione, come posso fare?

    ho risolto inserendo il seguente codice:
    MapViewController *rViewController = [[[MapViewController alloc] init] autorelease];
    [self.navigationController pushViewController:rViewController animated:YES];
    nell’implementazione dell’IBAction del tasto Mappa che ho inserito nella barra di navigazione;
    Funziona perfettamente, l’unica cosa è che se faccio il release di rViewController, si blocca l’applicazione, sapreste spiegarmi il perchè??

    Con che errore? Prova a copiare l’errore dalla console.
    Se ti da un EXEC BAD ADDRESS è pechè probabilmente rilasci il tuo puntatore prima di usarlo

    Anzi no, lo hai settato gia’ autorelease, dove vorresti rilasciarlo?

  22. 7 Maggio 2010

    sky1987

    scusami giorgio hai ragione, avendo 30 progetti aperti mi ero talmente incasinato la testa che ho scritto il codice senza guardarlo attentamente e abituato a scrivere in continuazione il comando [viewController release];
    non mi ero reso conto che l’avevo già rilasciato…grazie mille per avermelo fatto notare

  23. 8 Maggio 2010

    giorgio

    di nulla figurati 😀

  24. 9 Maggio 2010

    The Anonymous

    Ciao ragazzi, ho seguito un po il tutorial ma siccome ho la necessità di dover far inserire più annotazioni ho modificato qualcosa… ad esempio nel file .m dell’annotazione ho modificato cosi:

    [code]
    #import “Annotation.h”

    @implementation Annotation
    NSString *SOTTOTITOLO =@”esempio”;
    NSString *TITOLO = @”esempio”;

    float LONGITUDINE = 12.3886;
    float LATITUDINE = 43.106;

    – (id)init {
    coordinate.longitude = LONGITUDINE;
    coordinate.latitude = LATITUDINE;
    return [super init];
    }

    @synthesize coordinate;

    – (NSString *)title {
    return TITOLO;
    }

    – (NSString *)subtitle {
    return SOTTOTITOLO;
    }

    +(void) setTitoloESottotitolo:(NSString *)titolo :(NSString *)sottotitolo{
    TITOLO = titolo;
    SOTTOTITOLO = sottotitolo;
    }

    +(void) setCoordinate:(float)longitudine :(float)latitudine{
    LONGITUDINE = longitudine;
    LATITUDINE = latitudine;
    }

    @end

    [/code]

    questo perché poi dal file .m del controller posso richiamare i metodi per far cambiare coordinate, titolo e sottotitolo alla nuova notazione da dover inserire.
    questo è il codice che uso per far ciò sul file .m del controller:
    [code]
    [Annotation setTitoloESottotitolo:@”TitoloDiProva2″:@”SottotitoloDiProva2″];
    [Annotation setCoordinate:40:50];
    [mappa addAnnotation:[[[Annotation alloc] init] autorelease]];
    [/code]

    Il segnalino viola me lo inserisce correttamente e ci mette anche il nuovo titolo e sottotitolo, il problema è che se torno al precendete segnalino, mi vedo che anche quello ha cambiato il titolo e il sottotitolo!!
    come faccio quindi a creare più di un segnalino??????

    grazie mille a chi mi aiuta

  25. 9 Maggio 2010

    Luca Di Franco

    Noto parecchi errori. Dal codice intuisco che non sai bene la distinzione tra variabili/metodi di istanza e variabili/metodi di classe.
    A quanto ho capito tu hai dichiarato TITOLO e SOTTOTITOLO come attributi di classe. Questo vuol dire (detto brutalmente) che se cambi titolo e sottotitolo per uno lo cambi per tutti.
    La soluzione è usare attributi di istanza e metodi di istanza (quello col -) in modo che quando modifichi un’annotazione modifichi solo quell’istanza e non tutte.
    Quindi: prendi il file .h e insieme alle coordinate metti come attributo di classe titolo e sottotitolo (in modo che valgano solo per quella istanza) mentre per settarli o usi delle property o ti crei un init apposito. Fai lo stesso errore con le coordinate.

    Alla fine dovresti trovarti qualcosa del genere:

    — File .h —
    @interface Annotation : NSObject {
    CLLocationCoordinate2D coordinate;
    NSString *titolo;
    NSString *sottotitolo;
    }
    @property NSString *titolo
    @property NSString *sottotitolo;
    – (id)initWithCoordinate:(CLLocationCoordinate2D)coord;
    @end

    — File .m —

    @implementation Annotation
    @synthesize coordinate;
    @synthesize titolo;
    @synthesize sottotitolo;
    – (id)initWithCoordinate:(CLLocationCoordinate2D)coord {
    self = [super init];
    coordinate.longitude = coord.longitude;
    coordinate.latitude = coord.latitude;
    return self;
    }
    – (NSString *)title {
    return title;
    }
    – (NSString *)subtitle {
    return subtitle;
    }
    @end

    PS. È molto consigliato non usare float per riferirsi invece a dei CLLocationDegrees per un semplice motivo: le coordinate sono memorizzate in double non in float. In questi casi usa il tipo che ti dice la documentazione (ovvero CLLocationDegree) almeno vai sul sicuro 😉

  26. 9 Maggio 2010

    The Anonymous

    ok…. grazie mille.. ora provo ad applicare quello che mi hai detto e poi casomai chiedo ancora aiuto 😛

    cmq per quanto riguarda i due metodi ci ho messo il + perché con il – quando compilavo mi dava degli errori o dei warning nn mi ricordo

  27. 9 Maggio 2010

    The Anonymous

    🙂 eccomi di nuovo..

    ho rimodificato come mi hai detto, solo che non ho ancora capito come devo fare per mettere una nuova annotazione con titolo, sottotitolo e coordinate personalizzate, al click di un determinato pulsante…
    cioè nel file .m del controller come glie lo dico che voglio una nuova annotazione di titolo “Ciao”, sottotitolo “ciao2” e coordinate 100,100 ?

    ti ringrazio molto per la pazienza.. ciao ciao

  28. 9 Maggio 2010

    Luca Di Franco

    Nuova annotazione = nuovo oggetto di tipo Annotation = devi rifare la alloc e la init. Non puoi usare la stessa.

  29. 10 Maggio 2010

    Alen


    The Anonymous:

    eccomi di nuovo..
    ho rimodificato come mi hai detto, solo che non ho ancora capito come devo fare per mettere una nuova annotazione con titolo, sottotitolo e coordinate personalizzate, al click di un determinato pulsante…

    Io ho trovato piu semplice(ma anche piu “sporco”) creare direttamente altri view controller..tanti quanti me ne servono poi implementarli,aggiungere e modificare questa stringa
    [map addAnnotation:[[[GoogleHQAnnotation alloc] init] autorelease]];
    Invece che richiamare GoogleHQ richiami un’altro controller che ti sei creato.
    Rozzo ma funzionale 😀

  30. 10 Maggio 2010

    Luca Di Franco

    Non richiamerai un controller ma un oggetto conforme a MKAnnotation. Usando il codice che ho scritto al post #24 (visto che rappresenta un’annotazione generica e non una specifica come ad esempio quella di Google nel tutorial) per crearne una nuova e aggiungerla dovrai procedere come segue:

    CLLocationCoordinate2D coord;
    coord.latitude=0;
    coord.longitude=0;
    Annotation annotation = [[Annotation alloc] initWithCoordinate:coord];
    annotation.titolo = @”Mio titolo”;
    annotation.sottotitolo = @”Mio sottotitolo”;
    [map addAnnotation:annotation”];

    Tutto qui.

    Comunque c’è da correggere il post #24 in quando nel file .h mi son dimenticato di adottare il protocollo MKAnnotation. La prima riga deve essere quindi:
    @interface Annotation : NSObject {

  31. 7 Ottobre 2010

    Enrico

    Ciao,
    mi sapreste dire se è possibile sostituire la mappa di Google con un’altra mappa personalizzata? Magari sovrapponendo un’immagine alla mappa originale…

    Grazie
    Enrico

  32. 26 Gennaio 2011

    Problemi con XIB file

    Grande tutorial.
    A differenza tua io utilizzo l’interface builder (forse pure troppo). Ho un problema…..vengo e mi spiego:
    non riesco a fare calcolare la distanza tra la userLocation e un annotation in un UIViewController che ho inserito attraverso l’interface builder all’interno dello XIB principale. Vorrei qualche chiarimento ,se posso abusare della tua disponibilità, su come implementare il reverseGeocoder su questo UIViewController.
    Grazie
    Luca

  33. 26 Gennaio 2011

    Problemi con XIB file

    Allego parte del mio codice:

    – (id)initWithUserLocation:(CLLocation *)userLocation annotation:(id )annotation {
    self = [super init];
    CLLocation *chiesa1 = [[CLLocation alloc] initWithLatitude:37.663244 longitude:14.83521];
    distance = [userLocation distanceFromLocation:chiesa1];
    return self;
    }
    Il risultato deve essere passato ad una UILabel (dichiarata come IBOutlet):

    – (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
    if([view.annotation.title isEqualToString:@”San Antonio Abate”]){
    [home pushViewController:infochiesa1 animated:YES];
    distanzachiesa1.text = [NSString stringWithFormat:@”Distanza in metri: %0.f”, distance];
    }
    }

  34. 26 Gennaio 2011

    Problemi con XIB file

    La compilazione non mi da nessun errore ma nella label compare la dicitura:
    Distanza in metri: 0
    Ti prego aiutami
    Grazie

  35. 27 Gennaio 2011

    Luca Di Franco

    Se ho immaginato giusto il resto del codice il tuo errore è fare il calcolo della distanza all’interno della init. Devi dare il tempo al gps di agganciare il segnale.
    In pratica ti basta aggiungere la annotation e calcolare la distanza solo quando il gps aggancia la posizione (ovvero dove io all’interno del tutorial faccio lo zoom).

  36. 27 Gennaio 2011

    Problemi con XIB file

    Grazie luca
    Ho inserito il calcolo della distanza quando faccio lo zoom sul punto di interesse e sembra funzionare. Ti volevo chiedere un ultima cosa:
    Come faccio a settare le coorrdinate della userLocation. Sto provando con questo codice:
    CLLocation *chiesa1 = [[CLLocation alloc] initWithLatitude:37.663244 longitude:14.83521];
    CLLocation *userLocation = [[CLLocation alloc] initWithCoordinate:mappa1.userLocation.coordinate];
    distance = [userLocation distanceFromLocation:chiesa1];
    ma la compilazione non va.
    Qualche suggerimento?
    Grazie

  37. 27 Gennaio 2011

    Problemi con XIB file

    Chiudo il post grandissimo Luca per dirti che ho risolto con questo codice:
    CLLocation *userLocation = [[CLLocation alloc] initWithLatitude:mappa1.userLocation.location.coordinate.latitude longitude:mappa1.userLocation.location.coordinate.longitude];
    Ti ringrazio ancora e scusa per la mia poca dimistichezza con il codice. Del resto io sono solo un Geologo.
    Ciao

  38. 27 Gennaio 2011

    Luca Di Franco

    Non puoi cambiare te la user location. Se vai a vedere la documentazione della MKMapView vedrai che è un attributo di tipo readonly

  39. 21 Marzo 2011

    Claudio

    Anch’io ho avuto problemi con lo zoom, purtroppo il metodo:

    – (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation {

    viene richiamato solo se viene inserita una vera annotazione, e non dal puntino blu che indica la user location, qer cui anche la condizione di if non è mai vera (a meno di non trovarsi nello stesso punto di una annotazione). Ho provato anche a compilare il codice fornito con questo articolo ma anche li lo zoom non funziona.

    Mi viene da pensare che qualcosa sia cambiato nelle SDK da quanto è stato scritto questo articolo.

  40. 15 Giugno 2011

    Fra

    Scusate, mi servirebbe un’informazione urgente. Sto cercando di creare una variabile CLLocation da valori di latitudine e longitudine LONG INT. Come faccio?

  41. 15 Giugno 2011

    Luca Di Franco

    CLLocation usa i double. In Android mi pare che questi dati li recuperavo come long int e poi li utilizzavo come double moltiplicandoli per 10^-6

  42. 19 Febbraio 2012

    Fabio

    Bellissimo tutorial , ma se avessi più di un disclosure button come faccio ad intereccare quello che è stato realmente premuto per dare il dettaglio relativo all’annotation selezionata ?

    grazie

  43. 13 Marzo 2012

    Cardon

    Ciao Ragazzi sono in panico. Ho seguito le vostre istruzioni e funziona tutto ora vorrei capire come si fanno ad inserire più annotation ho modificato la classe in questo modo:
    @implementation CMapPoint
    @synthesize Title;
    @synthesize Coordinate;
    @synthesize Subtitle;
    – (id)init
    {
    self = [super init];
    if (self) {
    // Initialization code here.
    }
    return self;
    }
    -(id)initWithCoordinate:(CLLocationCoordinate2D)c m_Title:(NSString *)t{
    self= [super init];
    if(self){
    m_Coordinate=c;
    [self setTitle:t];
    [self setSubtitle:t];
    }
    return self;
    }
    -(NSString *) Title{
    return @”ksadaksjdjkas”;
    }
    -(NSString *) Subtitle{
    return @”weqwooeqwopqw”;
    }
    @end

    Nel controller mi creo l’annotation in questo modo:

    CMapPoint *sh=[[CMapPoint alloc]init];
    [sh setTitle:@”jskadjkh”];
    [sh setSubtitle:@”jasgd”];
    CLLocationCoordinate2D la;
    la.latitude=123.123781;
    la.longitude=12.1238;
    [sh setCoordinate:la];
    A questo punto non so visualizzare l’annotation sulla mappa .
    Il mio scopo è riuscire a visualizzare n annotation
    Mi date una mano per favore

    Grazie a tutti

  44. 14 Marzo 2012

    antonio

    Ciao Luca,
    riesumo questo tutorial perché lo trovo molto didattico nell’apprendimento di MapView. Io però non ho capito come aggiungere più punti. Ho provato creando delle nuove classi per ogni punto, implementandole nel file MapViewController.m e poi aggiungendo varie righe [map addAnnotation:[[[ounto2 alloc] init] autorelease]];
    quanti punti vorrei aggiungere. Poi nelle classi.m ho aggiunto le coordinate di ciascun punto ma non mi funziona. Mi puoi spiegare passo passo.

  45. 24 Aprile 2012

    Gaetano

    Una domanda da profano di mappe, ma mi serve sapere qualche informazione per valutare la fattibilità, prima di cominciare un progetto.
    MapKit si collega esclusivamente a google maps? Posso inserire una mia immagine e agganciarla a delle coordinate ed usarla per la navigazione?
    Spiego la mia esigenza, sono interessato ad inserire nella mia app, un area mappata erroneamente da google, per poter aggiungere i miei mark e percorsi, quindi mi chiedevo come poter risolvere il problema.

  46. 8 Settembre 2012

    [iOS] Inserire le mappe e la localizzazione con MapKit e CoreLocation

    […] Utilizzo del MapKit e delle Annotation View personalizzate […]

Leave a Reply

Your email address will not be published. Required fields are marked *


*
*

Corso online di programmazione android e java

SEZIONI

  • Android
  • Comunicazioni
  • Contest
  • Corsi ed Eventi
  • Corso completo di C
  • Corso programmazione videogiochi
  • Framework
  • Grafica e Design
  • Guida rapida alla programmazione Cocoa Touch
  • Guide Teoriche
  • Guide varie
  • iPad
  • Le nostre applicazioni
  • Libri e manuali
  • Materiale OpenSource
  • News
  • Pillole di C++
  • Progetti completi
  • Risorse utili
  • Strumenti di Sviluppo
  • Swift
  • Tips & Tricks
  • Tutorial Pratici
  • Video Tutorial
  • Windows Phone

Siti Amici

  • Adrirobot
  • Allmobileworld
  • Apple Notizie
  • Apple Tribù
  • Avvocato360
  • Blog informatico 360°
  • bubi devs
  • fotogriPhone
  • GiovaTech
  • iApp-Mac
  • iOS Developer Program
  • iPodMania
  • MelaRumors
  • Meritocracy
  • SoloTablet
  • TecnoUser
  • Privacy & Cookie Policy
©2009-2018 devAPP - All Rights Reserved | Contattaci
devAPP.it è un progetto di DEVAPP S.R.L. - Web & Mobile Agency di Torino
Str. Volpiano, 54 - 10040 Leini (TO) - C.F. e P.IVA 11263180017 - REA TO1199665 - Cap. Soc. € 10.000,00 i.v.

devACADEMY.it

Vuoi imparare a programmare?

Iscriviti e accedi a TUTTI i corsi con un’unica iscrizione.
Oltre 70 corsi e migliaia di videolezioni online e in italiano a tua disposizione.

ISCRIVITI SUBITO