Curs de programació d ’ iOS
description
Transcript of Curs de programació d ’ iOS
Curs de programació d’iOSNovembre de 2011
Organitza
11 Localització i mapes (CoreLocation i MapKit)
• La localització permet que les aplicacions puguin determinar la ubicació geogràfica del dispositiu.
• L’SDK proporciona el framework CoreLocation per obtenir les dades del GPS i la brúixola del disposotiu.
• L’SDK empra els mapes de Google Maps però per manipular-los proporciona el framework MapKit.
CoreLocation
• La classe que fa d’interfície amb el hardware (GPS i brúixola) s’anomena CLLocationManager
• CLLocationManager treballa en segon pla mentre la resta de l’aplicació es dedica a altres tasques com rebre la interacció de l’usuari i refrescar la interfície gràfica.
• Per treballar amb la classe CLLocationManager cal assignar-li un delegat que implementi CLLocationManagerDelegate
CoreLocation
#import <UIKit/UIKit.h>#import <CoreLocation/CoreLocation.h>
@interface ExempleAppDelegate : NSObject <UIApplicationDelegate, CLLocationManagerDelegate>{
UIWindow *window;CLLocationManager *locationManager;
}@property (nonatomic, retain) IBOutlet UIWindow *window;
@end
• ExempleAppDelegate.h
CoreLocation
• Una instància de CLLocationManager té propietats que podem configurar per concretar la seva freqüència d’actualització i el seu grau de precisió.
• La propietat distanceFilter fixa la distància, en metres, que el dispositiu ha de recórrer per tal que CLLocationManager informi al seu delegat d’una nova coordenada.
[locationManager setDistanceFilter:kCLDistanceFilterNone];
CoreLocation
• La propietat desiredAccuracy defineix el grau de precisió dels resultats que entrega el dispositiu a l’aplicació. CLLocationManager només entregarà la coordenada si aquesta compleix la precisió indicada.
[locationManager setDistanceFilter:kCLLocationAccuracyHundredMeters];
CoreLocation- (BOOL)application: (UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions{
// Crear l’objecte location managerlocationManager = [[CLLocationManager alloc] init];
// Assignar el delegate[locationManager setDelegate:self];
// Volem tots els resultats de location manager[locationManager setDistanceFilter:kCLDistanceFilterNone];
// Volem els resultats amb la màxima precisió possible[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
// S’indica que ja pot començar a capturar les coordenades del GPS[locationManager startUpdatingLocation];
[window makeKeyAndVisisble];return YES;
}
CoreLocation
• Quan una instància de CLLocationManager compta amb suficients dades per informar d’una nova coordenada, genera una instància de CLLocation
• CLLocation s’envia al delegat de CLLocationManager mitjançant el mètode delegat locationManager:didUpdateToLocation:fromLocation
CoreLocation
horizontalAccuracy = 1000
CLLocation
CLLocationCoordinate2D
Latitude = 41.739031Longitude = 1.847071
CoreLocation
- (void)locationManager: (CLLocationManager *)manager didUpdateToLocation: (CLLocation *)newLocation fromLocation: (CLLocation *)oldLocation{
NSLog(@“Nova posició: %f / %f", [newLocation coordinate].latitude, [newLocation coordinate].longitude);}
• Capturar la nova coordenada del GPS
- (void)locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error{
NSLog(@”No es poden obtenir coordenades: %@”, error);}
• Capturar errors durant la geolocalització
[locationManager stopUpdatingLocation];
• Capturar errors durant la geolocalització
MapKit
• MapKit és el framework que permet mostrar mapes amb informació geogràfica.
MapKit
• MapKit és el framework que permet mostrar mapes amb informació geogràfica.
• La classe MKMapView és l’encarregada de mostrar mapes, capturar-ne els tocs i gestos de l’usuari, i mostrar-hi anotacions.
• Per capturar les operacions que es fan sobre el mapa hem d’implementar el protocol MKMapViewDelegate
MapKit
• MKMapView pot ser de tres tipus:
MKMapTypeStandard MKMapTypeSatellite MKMapTypeHybrid
Exemple 11#import <MapKit/MapKit.h>
mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 367)];mapView.mapType = MKMapTypeStandard;mapView.delegate = self;mapView.scrollEnabled = YES;mapView.zoomEnabled = YES;[self.view addSubview:mapView];
mapType = [[UISegmentedControl alloc] initWithItems: [NSArray arrayWithObjects:@”Mapa”, @”Satèl·lit”, @”Híbrid”, nil]];[mapType setSelectedSegmentIndex:0];[mapType addTarget:self action:@selector(changeType:) forControlEvents:UIControlEventValueChanged];mapType.frame = CGRectMake(115, 328, 195, 30);mapType.segmentedControlStyle = UISegmentedControlStyleBar;[mapType setTintColor:[UIColor lightGrayColor]];[self.view addSubview:mapType];
- (void)changeType: (id)sender{
if(mapType.selectedSegmentIndex==0) { mapView.mapType=MKMapTypeStandard; }else if (mapType.selectedSegmentIndex==1) { mapView.mapType=MKMapTypeSatellite; } else if (mapType.selectedSegmentIndex==2) { mapView.mapType=MKMapTypeHybrid; }
}
MapKit• Podem definir una regió en un MKMapView. La regió defineix l’àrea
geogràfica que volem que mostri el mapa a partir d’una coordenada.
#import <MapKit/MapKit.h>
mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 367)];mapView.mapType = MKMapTypeStandard;mapView.showsUserLocation=TRUE;mapView.delegate = self;mapView.scrollEnabled = YES;mapView.zoomEnabled = YES;[self.view addSubview:mapView];
MKCoordinateRegion region;MKCoordinateSpan span;span.latitudeDelta=0.2;span.longitudeDelta=0.2;
CLLocationCoordinate2D location=mapView.userLocation.coordinate;region.span=span;region.center=location;[mapView setRegion:region animated:TRUE];[mapView regionThatFits:region];
MapKit – Etiquetatge de localitzacions• En un MKMapView hi podem afegir anotacions emprant classes que
implementin el protocol MKAnnotation
MapKit – Etiquetatge de localitzacions• Primer hem de crear i definir una classe NSObject que implementi el
protocol MKAnnotation
#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
MapPoint.h
#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
MapPoint.m
MapKit – Etiquetatge de localitzacions
MapKit – Etiquetatge de localitzacions• Afegir anotacions a un MKMapView
CLLocationCoordinate2D coordenada;coordenada.latitude = 41.739031;coordenada.longitude = 1.847071;
MapPoint *mp = [[MapPoint alloc] initWithCoordinate:coordenada title:@”CATIC”];[mapView addAnnotation:mp];[mp release];
• Eliminar anotacions d’un MKMapView[mapView removeAnnotations:[mapView annotations]];
• Centrar automàticament les anotacions quan s’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:region animated:YES];
}
12 Persistència de dades
• Preferències de l’usuari (NSUserDefaults)
• Base de dades SQL (SQLite)
• La classe NSUserDefaults permet afegir/obtenir les preferències de l’usuari a l’aplicació.
• Tamany del text• Gestió de contrassenyes • Username de l’anterior sessió• Llistes d’items favorits• etc...
• Aquestes dades es perden quan s’elimina l’aplicació del terminal.
NSUserDefaults
NSUserDefaults
• Les preferències d’usuari de les aplicacions es guarden a la carpeta Settings.bundle de l’aplicació.
• Aquesta carpeta ha de contenir el fitxer Root.plist on hi definirem parelles de clau-valor amb valors per defecte de l’aplicació.
NSUserDefaults
• Afegir una preferència d’usuari al diccionari:NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[defaults setObject:@”[email protected]” forKey:@”username”];[defaults setObject:@”3758nci56v456v545vg” forKey:@”passwd_xifrat”];[defaults synchronize];
• Obtenir una preferència d’usuari del diccionari:NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];NSString *username = [defaults objectForKey:@”username”];NSString *passwd = [defaults objectForKey:@”passwd_xifrat”];