230 likes | 352 Views
Curs de programació d ’ iOS. Novembre de 2011. Organitza. 11 L ocalització i mapes ( CoreLocation i MapKit ). La localització permet que les aplicacions puguin determinar la ubicació geogràfica del dispositiu .
E N D
Curs de programació d’iOS Novembre de 2011 Organitza
11 Localització i mapes(CoreLocation i MapKit) • La localitzaciópermet que les aplicacionspuguin determinar la ubicaciógeogràfica del dispositiu. • L’SDK proporciona el frameworkCoreLocationper obtenir les dades del GPS i la brúixola del disposotiu. • L’SDK empra elsmapes de Google Mapsperò per manipular-los proporciona el frameworkMapKit.
CoreLocation • La classe que fa d’interfícieamb el hardware (GPS i brúixola)s’anomenaCLLocationManager • CLLocationManager treballa en segonplamentre la resta de l’aplicació es dedica a altres tasques comrebre la interacció de l’usuari i refrescar la interfíciegràfica. • Per treballaramb la classeCLLocationManager cal assignar-li un delegat que implementiCLLocationManagerDelegate
CoreLocation • ExempleAppDelegate.h #import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> @interface ExempleAppDelegate : NSObject <UIApplicationDelegate, CLLocationManagerDelegate> { UIWindow *window; CLLocationManager *locationManager; } @property (nonatomic, retain) IBOutletUIWindow *window; @end
CoreLocation • Una instància de CLLocationManager té propietats que podem configurar per concretar la sevafreqüènciad’actualització i el seugrau de precisió. • La propietatdistanceFilterfixa la distància, en metres, que el dispositiu ha de recórrer per tal que CLLocationManagerinformi al seudelegatd’una nova coordenada. [locationManagersetDistanceFilter:kCLDistanceFilterNone];
CoreLocation • La propietatdesiredAccuracydefineix el grau de precisiódelsresultats que entrega el dispositiu a l’aplicació. CLLocationManagernomésentregarà la coordenada si aquestacompleix la precisió indicada. [locationManagersetDistanceFilter:kCLLocationAccuracyHundredMeters];
CoreLocation - (BOOL)application: (UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { // Crear l’objectelocation manager locationManager = [[CLLocationManageralloc] init]; // Assignar el delegate [locationManagersetDelegate:self]; // Volemtotselsresultats de location manager [locationManagersetDistanceFilter:kCLDistanceFilterNone]; // Volemelsresultatsamb la màximaprecisiópossible [locationManagersetDesiredAccuracy:kCLLocationAccuracyBest]; // S’indica que japotcomençar a capturar les coordenades del GPS [locationManagerstartUpdatingLocation]; [windowmakeKeyAndVisisble]; return YES; }
CoreLocation • Quan una instància de CLLocationManagercomptaambsuficientsdades per informar d’una nova coordenada, genera una instància de CLLocation • CLLocations’envia al delegat de CLLocationManagermitjançant el mètodedelegatlocationManager:didUpdateToLocation:fromLocation
CoreLocation CLLocation horizontalAccuracy = 1000 CLLocationCoordinate2D Latitude = 41.739031 Longitude= 1.847071
CoreLocation • Capturar la nova coordenada del GPS - (void)locationManager: (CLLocationManager *)manager didUpdateToLocation: (CLLocation *)newLocationfromLocation: (CLLocation *)oldLocation { NSLog(@“Nova posició: %f / %f", [newLocationcoordinate].latitude, [newLocationcoordinate].longitude); } • Capturar errorsdurant la geolocalització - (void)locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error { NSLog(@”No es poden obtenircoordenades: %@”, error); } • Capturar errorsdurant la geolocalització [locationManagerstopUpdatingLocation];
MapKit • MapKités el framework que permet mostrar mapesambinformaciógeogràfica.
MapKit • MapKités el framework que permet mostrar mapesambinformaciógeogràfica. • La classeMKMapViewésl’encarregada de mostrar mapes, capturar-neelstocs i gestos de l’usuari, i mostrar-hi anotacions. • Per capturar les operacions que es fan sobre el mapa hemd’implementar el protocolMKMapViewDelegate
MapKit • MKMapViewpot ser de tres tipus: MKMapTypeStandardMKMapTypeSatelliteMKMapTypeHybrid
Exemple 11 #import <MapKit/MapKit.h> mapView = [[MKMapViewalloc] initWithFrame:CGRectMake(0, 0, 320, 367)]; mapView.mapType = MKMapTypeStandard; mapView.delegate = self; mapView.scrollEnabled = YES; mapView.zoomEnabled = YES; [self.viewaddSubview:mapView]; mapType= [[UISegmentedControlalloc] initWithItems: [NSArrayarrayWithObjects:@”Mapa”, @”Satèl·lit”, @”Híbrid”, nil]]; [mapType setSelectedSegmentIndex:0]; [mapTypeaddTarget:self action:@selector(changeType:) forControlEvents:UIControlEventValueChanged]; mapType.frame = CGRectMake(115, 328, 195, 30); mapType.segmentedControlStyle = UISegmentedControlStyleBar; [mapTypesetTintColor:[UIColorlightGrayColor]]; [self.viewaddSubview:mapType]; - (void)changeType: (id)sender { if(mapType.selectedSegmentIndex==0) { mapView.mapType=MKMapTypeStandard; } elseif(mapType.selectedSegmentIndex==1) { mapView.mapType=MKMapTypeSatellite; } elseif(mapType.selectedSegmentIndex==2) { mapView.mapType=MKMapTypeHybrid; } }
MapKit • Podem definir una regió en un MKMapView. La regiódefineixl’àreageogràfica que volem que mostri el mapa a partir d’una coordenada. #import <MapKit/MapKit.h> mapView = [[MKMapViewalloc] initWithFrame:CGRectMake(0, 0, 320, 367)]; mapView.mapType = MKMapTypeStandard; mapView.showsUserLocation=TRUE; mapView.delegate = self; mapView.scrollEnabled = YES; mapView.zoomEnabled = YES; [self.viewaddSubview:mapView]; MKCoordinateRegionregion; MKCoordinateSpanspan; span.latitudeDelta=0.2; span.longitudeDelta=0.2; CLLocationCoordinate2D location=mapView.userLocation.coordinate; region.span=span; region.center=location; [mapViewsetRegion:regionanimated:TRUE]; [mapViewregionThatFits:region];
MapKit – Etiquetatge de localitzacions • En un MKMapView hi podemafegiranotacionsemprantclasses que implementin el protocolMKAnnotation
MapKit – Etiquetatge de localitzacions • Primer hem de crear i definir una classeNSObject que implementi el protocolMKAnnotation MapPoint.h #import <Foundation/Foundation.h> #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h> @interface MapPoint : NSObject <MKAnnotation> { NSString *title; CLLocationCoordinate2D coordinate; } @property (nonatomic, readonly) CLLocationCoordinate2D coordinate; @property (nonatomic, copy) NSString *title; - (id) initWithCoordinate: (CLLocationCoordinate2D)c title: (NSString *)t; @end
MapKit – Etiquetatge de localitzacions MapPoint.m #import “MapPoint.h” @implementation MapPoint @synthesize coordinate, title; - (id)initWithCoordinate: (CLLocationCoordinate2D)c title: (NSString *)t { self = [super init]; coordinate = c; [self setTitle:t]; return self; } - (void)dealloc { [title release]; [super dealloc]; } @end
MapKit – Etiquetatge de localitzacions • Afegiranotacions a un MKMapView CLLocationCoordinate2D coordenada; coordenada.latitude = 41.739031; coordenada.longitude = 1.847071; MapPoint *mp = [[MapPointalloc] initWithCoordinate:coordenadatitle:@”CATIC”]; [mapViewaddAnnotation:mp]; [mp release]; • Eliminar anotacionsd’unMKMapView [mapViewremoveAnnotations:[mapViewannotations]]; • Centrar automàticament les anotacionsquans’afegeixen - (void)mapView: (MKMapView *)mv didAddAnnotationViews: (NSArray *)views { MKAnnotationView *annotationView = [views objectAtIndex:0]; id <MKAnnotation> mp = [annotationView annotation]; MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate], 250, 250); [mv setRegion:regionanimated:YES]; }
12 Persistència de dades • Preferències de l’usuari(NSUserDefaults) • Base de dades SQL (SQLite)
NSUserDefaults • La classeNSUserDefaultspermetafegir/obtenir les preferències de l’usuari a l’aplicació. • Tamany del text • Gestió de contrassenyes • Username de l’anteriorsessió • Llistesd’itemsfavorits • etc... • Aquestesdades es perdenquans’eliminal’aplicació del terminal.
NSUserDefaults • Les preferènciesd’usuari de les aplicacions es guarden a la carpeta Settings.bundle de l’aplicació. • Aquesta carpeta ha de contenir el fitxerRoot.pliston hi definiremparelles de clau-valor ambvalors per defecte de l’aplicació.
NSUserDefaults • Afegir una preferènciad’usuari al diccionari: NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults]; [defaults setObject:@”anadalg@gmail.com” forKey:@”username”]; [defaults setObject:@”3758nci56v456v545vg” forKey:@”passwd_xifrat”]; [defaults synchronize]; • Obtenir una preferènciad’usuari del diccionari: NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults]; NSString *username = [defaults objectForKey:@”username”]; NSString *passwd = [defaults objectForKey:@”passwd_xifrat”];