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).

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.

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.

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









46 Responses to “T#028 – Utilizzo del MapKit (parte 1): Zoom e Annotation View personalizzate”
27 Marzo 2010
fastditemi che una delle parti del tutorial mapkit include l’utilizzo del magnetometro……
27 Marzo 2010
ByterosComplimenti 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” ];
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.
28 Marzo 2010
NeoTutorial fantastico!! Complimenti!! Attendo con ansia il seguito.. Grazie mille!!!
28 Marzo 2010
ByterosOps, scusa, ho rovinato la sorpresa 😀
Voleva essere una dritta per gli utenti cmq, non per te ovviamente.
Complimenti ancora.
15 Aprile 2010
Davidete manca la * prima del “navController”…, foto numero 4….
15 Aprile 2010
Luca Di FrancoPiccolo grande errore dovuto ad una piccola modifica rispetto i sorgenti su google code . Grazie della segnalazione vedrò di modificarlo il prima possibile
20 Aprile 2010
Massimo OddoliniSecondo voi è possibile utilizzando il map kit andare a ricercare 2 posizioni sulla mappa e calcolarne la distanza in km o m?
Grazie mille.
20 Aprile 2010
Luca Di FrancoCol 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.
20 Aprile 2010
Luca Di FrancoMi sono accorto ora che distanceFromLocation è per OS 3.2, per il 3.1 devi usare invece getDistanceFrom:
23 Aprile 2010
amokOttimo lavoro!!!
3 Maggio 2010
AlenDomanda. 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.
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. […]
5 Maggio 2010
Luca Di FrancoProva a controllare di aver settato il delegate della mappa (map.delegate = self;)
6 Maggio 2010
sky1987Ciao 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?
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.
7 Maggio 2010
AlenDove 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
7 Maggio 2010
sky1987ho 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è??
7 Maggio 2010
giorgiocon che
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
7 Maggio 2010
giorgioNel
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
7 Maggio 2010
giorgioAnzi no, lo hai settato gia’ autorelease, dove vorresti rilasciarlo?
7 Maggio 2010
sky1987scusami 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
8 Maggio 2010
giorgiodi nulla figurati 😀
9 Maggio 2010
The AnonymousCiao 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
9 Maggio 2010
Luca Di FrancoNoto 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 😉
9 Maggio 2010
The Anonymousok…. 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
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
9 Maggio 2010
Luca Di FrancoNuova annotazione = nuovo oggetto di tipo Annotation = devi rifare la alloc e la init. Non puoi usare la stessa.
10 Maggio 2010
AlenIo 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 😀
10 Maggio 2010
Luca Di FrancoNon 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 {
7 Ottobre 2010
EnricoCiao,
mi sapreste dire se è possibile sostituire la mappa di Google con un’altra mappa personalizzata? Magari sovrapponendo un’immagine alla mappa originale…
Grazie
Enrico
26 Gennaio 2011
Problemi con XIB fileGrande 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
26 Gennaio 2011
Problemi con XIB fileAllego 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];
}
}
26 Gennaio 2011
Problemi con XIB fileLa compilazione non mi da nessun errore ma nella label compare la dicitura:
Distanza in metri: 0
Ti prego aiutami
Grazie
27 Gennaio 2011
Luca Di FrancoSe 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).
27 Gennaio 2011
Problemi con XIB fileGrazie 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
27 Gennaio 2011
Problemi con XIB fileChiudo 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
27 Gennaio 2011
Luca Di FrancoNon puoi cambiare te la user location. Se vai a vedere la documentazione della MKMapView vedrai che è un attributo di tipo readonly
21 Marzo 2011
ClaudioAnch’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.
15 Giugno 2011
FraScusate, mi servirebbe un’informazione urgente. Sto cercando di creare una variabile CLLocation da valori di latitudine e longitudine LONG INT. Come faccio?
15 Giugno 2011
Luca Di FrancoCLLocation 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
19 Febbraio 2012
FabioBellissimo 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
13 Marzo 2012
CardonCiao 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
14 Marzo 2012
antonioCiao 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.
24 Aprile 2012
GaetanoUna 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.
8 Settembre 2012
[iOS] Inserire le mappe e la localizzazione con MapKit e CoreLocation[…] Utilizzo del MapKit e delle Annotation View personalizzate […]