Programmation iOS M1 informatique -...

Post on 22-Jul-2020

0 views 0 download

Transcript of Programmation iOS M1 informatique -...

Programmation iOSM1 informatique

Étienne Payet

Département de mathématiques et d’informatique

Ces transparents sont mis à disposition selon les termes de la Licence Creative Commons Paternité - Pasd’Utilisation Commerciale - Pas de Modification 3.0 non transcrit.

Étienne Payet (DMI) Programmation iOS – M1 informatique 1 / 90

Plan

1 Internationalisation

2 Protocoles et délégation

3 Géolocalisation

4 La classe CMMotionManager

5 Lecture audio

6 Gestes courants

7 Appareil photo

Étienne Payet (DMI) Programmation iOS – M1 informatique 2 / 90

Internationalisation

éléments culturels : éléments qui dépendent d’une région (langue,symbole monétaire, unités de mesure, format de date. . .)

l’utilisateur peut spécifier ces éléments grâce à l’application Réglagesd’iOS

idée : créer une application qui tient compte des éléments culturelschoisis par l’utilisateur

astuce : rendre le code indépendant de ces éléments (pour alléger lecode, faciliter la prise en compte d’une nouvelle région. . .)

Étienne Payet (DMI) Programmation iOS – M1 informatique 3 / 90

La classe NSLocale

toute instance contient les éléments culturels suivants pour une régiondonnée : symbole monétaire, format de date, représentation desnombres à virgule, système métrique

[NSLocale currentLocale] renvoie une instance de NSLocale liée àla région choisie par l’utilisateur

méthode objectForKey: pour obtenir la valeur d’un élément culturelparticulier :[[NSLocale currentLocale]

objectForKey:NSLocaleCurrencySymbol]

Étienne Payet (DMI) Programmation iOS – M1 informatique 4 / 90

Chaînes de caractères

créer un fichier nommé Localizable.strings :

File → New → File . . . puis iOS → Resource → Strings File

sauvegarder dans le dossier Base.lproj

ce fichier doit être constitué d’items de la forme :/* commentaire */"clé" = "valeur";

dans le code, remplacer les chaînes de caractères par :NSLocalizedString(@"clé", @"commentaire")

Étienne Payet (DMI) Programmation iOS – M1 informatique 5 / 90

Chaînes de caractères

Localizable.strings/* Application Main Title */"title" = "Device Position";

/* Symbol for North */"North" = "N";

/* Symbol for South */"South" = "S";

/* Symbol for East */"East" = "E";

/* Symbol for West */"West" = "W";

ViewController.m- (void)viewDidLoad{

[super viewDidLoad];self.navigationItem.title =

NSLocalizedString(@"title",@"Application Main Title");

}

Étienne Payet (DMI) Programmation iOS – M1 informatique 6 / 90

Localisation

c’est le processus qui consiste à créer des ressources spécifiques pourdifférentes langues : chaînes de caractères, fichiers .storyboard. . .

pour ajouter de nouvelles ressources :

sélectionner le projet dans le navigateur d’Xcodefaire défiler l’éditeur jusqu’à l’item Localizationsappuyer sur +

les fichiers Localizable.strings spécifiques à chaque langue nediffèrent que par les valeurs des items (les commentaires et les clés nechangent pas)

Étienne Payet (DMI) Programmation iOS – M1 informatique 7 / 90

Exercice

Étienne Payet (DMI) Programmation iOS – M1 informatique 8 / 90

Exercice : indications

formatage de la date : classe NSDateFormatter

méthodes :

- (void)setDateStyle:(NSDateFormatterStyle)style- (void)setTimeStyle:(NSDateFormatterStyle)style

constantes pour le style :

NSDateFormatterNoStyle, NSDateFormatterShortStyle,NSDateFormatterMediumStyle, NSDateFormatterLongStyle,NSDateFormatterFullStyle

Étienne Payet (DMI) Programmation iOS – M1 informatique 9 / 90

Barre d’outils

instance de la classe UIToolbar (sous-classe de UIView)

s’inscrit donc dans une frame

peut se placer n’importe où sur l’écran (en général en haut ou en bas)

contient des boutons (classe UIBarButtonItem)

Étienne Payet (DMI) Programmation iOS – M1 informatique 10 / 90

Barre d’outils : apparence

dans la classe UIToolbar :

@property(nonatomic) UIBarStyle barStyle@property(nonatomic, retain) UIColor *tintColor@property(nonatomic, retain) UIColor *barTintColor

style de barre (UIBarStyle) :

UIBarStyleDefault, UIBarStyleBlack

Étienne Payet (DMI) Programmation iOS – M1 informatique 11 / 90

Barre d’outils : les boutons

propriété items de la classe UIToolbar : c’est un NSArray deUIBarButtonItem

@property(nonatomic, copy) NSArray *items

construction d’un UIBarButtonItem :

- (id)initWithTitle:(NSString *)titlestyle:(UIBarButtonItemStyle)style

target:(id)target action:(SEL)action

- (id)initWithCustomView:(UIView *)customView

- (id)initWithBarButtonSystemItem:(UIBarButtonSystemItem)itemtarget:(id)target action:(SEL)action

...

Étienne Payet (DMI) Programmation iOS – M1 informatique 12 / 90

Barre d’outils : les boutons

style des boutons avec titre (UIBarButtonItemStyle) :

UIBarButtonItemStylePlain, UIBarButtonItemStyleDone

boutons système (UIBarButtonSystemItem) :

UIBarButtonSystemItemDone, UIBarButtonSystemItemCancel,UIBarButtonSystemItemEdit, UIBarButtonSystemItemSave,UIBarButtonSystemItemFlexibleSpace,UIBarButtonSystemItemFixedSpace,UIBarButtonSystemItemAdd, ...

Étienne Payet (DMI) Programmation iOS – M1 informatique 13 / 90

Exercice : ajout d’une barre d’outils à l’exercice précédent

Étienne Payet (DMI) Programmation iOS – M1 informatique 14 / 90

Plan

1 Internationalisation

2 Protocoles et délégation

3 Géolocalisation

4 La classe CMMotionManager

5 Lecture audio

6 Gestes courants

7 Appareil photo

Étienne Payet (DMI) Programmation iOS – M1 informatique 15 / 90

Protocole

c’est une liste de déclarations de propriétés et de méthodes

ce n’est pas une classe : pas d’instances, pas de variables d’instances

ne contient aucune implémentation de méthode : l’implémentation estlaissée aux classes qui se conforment au protocole

proche des interfaces de Java

Étienne Payet (DMI) Programmation iOS – M1 informatique 16 / 90

Définition d’un protocole

@protocol MyProtocol <NSObject>

@required

... // déclaration des éléments obligatoires

@optional

... // déclaration des éléments optionnels

@end

Étienne Payet (DMI) Programmation iOS – M1 informatique 17 / 90

Déclaration de conformité

MyClass.h@interface MyClass : NSObject <MyProtocol>

... // ne pas déclarer de méthodes du protocole

... // déclarer les propriétés du protocole utilisées

@end

MyClass.m@synthesize ... // les propriétés du protocole utilisées

implémentation des méthodes obligatoires du protocole

implémentation de méthodes optionnelles du protocole

Étienne Payet (DMI) Programmation iOS – M1 informatique 18 / 90

Délégation

schéma très courant sous Cocoa Touch

approche OO du traitement de certains événements

un délégué est associé à un objet ; cet objet envoie des messages à sondélégué lorsque certains événements se produisent

les messages envoyés au délégué correspondent à des méthodes d’unprotocole auquel le délégué se conforme

Étienne Payet (DMI) Programmation iOS – M1 informatique 19 / 90

Exemple : un formulaire de saisie

AddViewController.h@protocol AddDelegate <NSObject>

- (void)addName:(NSString *)name;

@end

@interface AddViewController : UIViewController <UITextFieldDelegate>

@property (weak, nonatomic) IBOutlet UITextField *nameTextField;@property(nonatomic, assign) id<AddDelegate> delegate;

- (IBAction)cancel:(id)sender;- (IBAction)save:(id)sender;

@end

Étienne Payet (DMI) Programmation iOS – M1 informatique 20 / 90

Exemple : un formulaire de saisie

AddViewController.m- (IBAction)cancel:(id)sender {

[[self delegate] addName:nil];}

- (IBAction)save:(id)sender {[[self delegate] addName:[[self nameTextField] text]];

}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {[textField resignFirstResponder];return YES;

}

Étienne Payet (DMI) Programmation iOS – M1 informatique 21 / 90

Exemple : utilisation du formulaire

MyTableViewController.h#import "AddViewController.h"

@interface MyTableViewController : UITableViewController <AddDelegate>{

NSMutableArray *objects;}

@end

Étienne Payet (DMI) Programmation iOS – M1 informatique 22 / 90

Exemple : utilisation du formulaire

MyTableViewController.m- (void)addName:(NSString *)name {

if (name) {if (!self.objects) self.objects = [[NSMutableArray alloc] init];

[self.objects insertObject:name atIndex:0];NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];[self.tableView insertRowsAtIndexPaths:@[indexPath]

withRowAnimation:UITableViewRowAnimationAutomatic];}

[self dismissViewControllerAnimated:YES completion:NULL];}

Étienne Payet (DMI) Programmation iOS – M1 informatique 23 / 90

Exemple : utilisation du formulaire

dans Main.storyboard :

il y a un bouton + dans la barre de titre de laUITableViewController

un segue (présentation modale) relie ce bouton au formulaire de saisie,l’identifiant de ce segue est addName

Étienne Payet (DMI) Programmation iOS – M1 informatique 24 / 90

Exemple : utilisation du formulaire

MyTableViewController.m- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

...if ([[segue identifier] isEqualToString:@"addName"]) {

AddViewController *controller =(AddViewController *)[segue destinationViewController];

[controller setDelegate:self];}

}

Étienne Payet (DMI) Programmation iOS – M1 informatique 25 / 90

Exercice

Étienne Payet (DMI) Programmation iOS – M1 informatique 26 / 90

Exemple délegation : UIActionSheet

Étienne Payet (DMI) Programmation iOS – M1 informatique 27 / 90

Exemple délegation : UIActionSheet

pour confirmer une action potentiellement dangereuse

protocole UIActionSheetDelegate

création :

- (id)initWithTitle:(NSString *)titledelegate:(id<UIActionSheetDelegate>)delegate

cancelButtonTitle:(NSString *)cancelButtonTitledestructiveButtonTitle:(NSString *)destructiveButtonTitle

otherButtonTitles:(NSString *)otherButtonTitles,...nil

Étienne Payet (DMI) Programmation iOS – M1 informatique 28 / 90

Exemple délegation : UIActionSheet

affichage :

- (void)showFromRect:(CGRect)rectinView:(UIView *)view

animated:(BOOL)animated

- (void)showFromBarButtonItem:(UIBarButtonItem *)itemanimated:(BOOL)animated

- (void)showFromTabBar:(UITabBar *)view

- (void)showFromToolbar:(UIToolbar *)view

- (void)showInView:(UIView *)view

Étienne Payet (DMI) Programmation iOS – M1 informatique 29 / 90

Exemple délegation : UIActionSheet

protocole UIActionSheetDelegate :

- (void)actionSheet:(UIActionSheet *)actionSheetclickedButtonAtIndex:(NSInteger)buttonIndex

- (void)actionSheetCancel:(UIActionSheet *)actionSheet

...

Étienne Payet (DMI) Programmation iOS – M1 informatique 30 / 90

Autre exemple délegation : UIAlertView

Étienne Payet (DMI) Programmation iOS – M1 informatique 31 / 90

UIActionSheet et UIAlertView

attention : UIActionSheet et UIAlertView sont obsolètes (deprecated)depuis iOS 8

elles sont toutes deux remplaçées par la classe UIAlertController

voir la documentation

Étienne Payet (DMI) Programmation iOS – M1 informatique 32 / 90

Exercice : extension de l’exercice précédent

Étienne Payet (DMI) Programmation iOS – M1 informatique 33 / 90

Plan

1 Internationalisation

2 Protocoles et délégation

3 Géolocalisation

4 La classe CMMotionManager

5 Lecture audio

6 Gestes courants

7 Appareil photo

Étienne Payet (DMI) Programmation iOS – M1 informatique 34 / 90

CoreLocation

c’est un framework = collection de classes

contient les classes qui permettent de gérer la géolocalisation

non-inclus par défaut, le programmeur doit l’ajouter à l’application :

sélectionner le projet dans le navigateur d’Xcode

sélectionner la cible (target) dans la partie éditeur

dérouler Link Binary With Libraries

appuyer sur + et choisir CoreLocation.framework

Étienne Payet (DMI) Programmation iOS – M1 informatique 35 / 90

Classe CLLocationManager

fournie par CoreLocation

fait l’interface avec le matériel de géolocalisation

toute instance a un délégué se conformant au protocoleCLLocationManagerDelegate

des messages sont envoyés au délégué lorsque certains événements seproduisent (nouvelle position, entrée dans une zone, échec delocalisation. . .)

Étienne Payet (DMI) Programmation iOS – M1 informatique 36 / 90

Protocole CLLocationManagerDelegate

@protocol CLLocationManagerDelegate <NSObject>

@optional

- (void)locationManager:(CLLocationManager *)managerdidUpdateLocations:(NSArray *)locations;

- (void)locationManager:(CLLocationManager *)managerdidFailWithError:(NSError *)error;

...

@end

Étienne Payet (DMI) Programmation iOS – M1 informatique 37 / 90

Exemple : afficher sa position

ViewController.h#import <CoreLocation/CoreLocation.h>

@interface ViewController : UIViewController <CLLocationManagerDelegate>{

CLLocationManager *locationManager;}@end

Étienne Payet (DMI) Programmation iOS – M1 informatique 38 / 90

Exemple : afficher sa position

ViewController.m- (void)viewDidLoad {

...if ([CLLocationManager locationServicesEnabled]) {

locationManager = [[CLLocationManager alloc] init];[locationManager setDelegate:self];[locationManager setDistanceFilter:50];[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];[locationManager startUpdatingLocation];

}...

}

...

Étienne Payet (DMI) Programmation iOS – M1 informatique 39 / 90

Exemple : afficher sa position

ViewController.m...

- (void)locationManager:(CLLocationManager *)managerdidUpdateLocations:(NSArray *)locations {

CLLocation* location = [locations lastObject];CLLocationDegrees latitude = [location coordinate].latitude;CLLocationDegrees longitude = [location coordinate].longitude;NSLog(@"(%.3f,%.3f)", latitude, longitude);[locationManager stopUpdatingLocation];

}

- (void)locationManager:(CLLocationManager *)managerdidFailWithError:(NSError *)error {

NSLog(@"Could not find location: %@", error);}

Étienne Payet (DMI) Programmation iOS – M1 informatique 40 / 90

Un nouveau système de permission depuis iOS8

WhenInUse : l’application reçoit des mises-à-jour de localisationuniquement quand elle s’exécute au premier plan

Always : l’application reçoit des mises-à-jour de localisation quand elles’exécute au premier plan et en arrière-plan

les 2 peuvent figurer dans une même application

Étienne Payet (DMI) Programmation iOS – M1 informatique 41 / 90

Un nouveau système de permission depuis iOS8

il faut requérir explicitement la permission : méthodesrequestWhenInUseAuthorization et requestAlwaysAuthorization

- (void)viewDidLoad {...if ([CLLocationManager locationServicesEnabled]) {

locationManager = [[CLLocationManager alloc] init];

// Vérifier si iOS8:if ([locationManager respondsToSelector:

@selector(requestWhenInUseAuthorization)])[self.locationManager requestWhenInUseAuthorization];

[locationManager startUpdatingLocation];}...

Étienne Payet (DMI) Programmation iOS – M1 informatique 42 / 90

Un nouveau système de permission depuis iOS8

pour que ça fonctionne en arrière-plan

Étienne Payet (DMI) Programmation iOS – M1 informatique 43 / 90

Un nouveau système de permission depuis iOS8

à déclarer dans le fichier info.plist :

<key>NSLocationWhenInUseUsageDescription</key><string>Message WhenInUse</string>

<key>NSLocationAlwaysUsageDescription</key><string>Message Always</string>

les messages s’affichent dans une UIAlertView lorsque la permissionest requise

Étienne Payet (DMI) Programmation iOS – M1 informatique 44 / 90

Un nouveau système de permission depuis iOS8

alerte WhenInUse alerte Always

Étienne Payet (DMI) Programmation iOS – M1 informatique 45 / 90

Exercice

détection des changements de position

l’affichage tient compte de la langue

Étienne Payet (DMI) Programmation iOS – M1 informatique 46 / 90

Passage dans une zone circulaire

classe CLCircularRegion (sous-classe de CLRegion)

création d’une instance :- (id)initWithCenter:(CLLocationCoordinate2D)center

radius:(CLLocationDistance)radiusidentifier:(NSString *)identifier

center = centre (latitude, longitude) de la zoneradius = rayon (mètres) de la zone

Étienne Payet (DMI) Programmation iOS – M1 informatique 47 / 90

Passage dans une zone circulaire

iOS8 : permission Always obligatoire

méthodes de la classe CLLocationManager :- (void)startMonitoringForRegion:(CLRegion *)region- (void)stopMonitoringForRegion:(CLRegion *)region

Étienne Payet (DMI) Programmation iOS – M1 informatique 48 / 90

Passage dans une zone circulaire

@protocol CLLocationManagerDelegate <NSObject>

@optional

...

- (void)locationManager:(CLLocationManager *)managerdidEnterRegion:(CLRegion *)region;

- (void)locationManager:(CLLocationManager *)managerdidExitRegion:(CLRegion *)region;

- (void)locationManager:(CLLocationManager *)managermonitoringDidFailForRegion:(CLRegion *)region

withError:(NSError *)error;

...

@end

Étienne Payet (DMI) Programmation iOS – M1 informatique 49 / 90

Passage dans une zone circulaire

ViewController.m- (void)viewDidLoad{

...CLLocationCoordinate2D center =

CLLocationCoordinate2DMake(-33.8634, 151.211);

CLCircularRegion *region = [[CLCircularRegion alloc]initWithCenter:centerradius:100000.0identifier:@"Sydney"];

...}

Étienne Payet (DMI) Programmation iOS – M1 informatique 50 / 90

Passage dans une zone circulaire

ViewController.m- (void)locationManager:(CLLocationManager *)manager

didEnterRegion:(CLRegion *)region{

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Attention"message:@"Entrée"

delegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil];

[alert show];}

Étienne Payet (DMI) Programmation iOS – M1 informatique 51 / 90

Exercice

ajoutez un mécanisme de détectiond’entrée/sortie d’une zone circulairedéfinie en dur dans le programme

Étienne Payet (DMI) Programmation iOS – M1 informatique 52 / 90

MapKit

c’est un framework

non-inclus par défaut

fournit la classe MKMapView pour l’affichage de cartes

- utilise CoreLocation en interne

- pour activer la recherche de la position et son affichage sur une carte :

@property(nonatomic) BOOL showsUserLocation

- toute instance a un délégué se conformant au protocoleMKMapViewDelegate

Étienne Payet (DMI) Programmation iOS – M1 informatique 53 / 90

Protocole MKMapViewDelegate

@protocol MKMapViewDelegate <NSObject>

@optional

- (void)mapView:(MKMapView *)mapViewdidUpdateUserLocation:(MKUserLocation *)userLocation

- (void)mapView:(MKMapView *)mapViewdidFailToLocateUserWithError:(NSError *)error;

...

@end

Étienne Payet (DMI) Programmation iOS – M1 informatique 54 / 90

Exemple : afficher sa position sur une carte

ViewController.h#import <UIKit/UIKit.h>#import <MapKit/MapKit.h>

@interface ViewController : UIViewController<CLLocationManagerDelegate, MKMapViewDelegate> {

CLLocationManager *locationManager;CLLocation *currentLocation;

}

@property (weak, nonatomic) IBOutlet MKMapView *worldView;

- (IBAction)ouSuisJe:(id)sender;

@end

Étienne Payet (DMI) Programmation iOS – M1 informatique 55 / 90

Exemple : afficher sa position sur une carte

ViewController.m- (void)viewDidLoad {

[super viewDidLoad];

if ([CLLocationManager locationServicesEnabled]) {locationManager = [[CLLocationManager alloc] init];...[locationManager setDelegate:self];

if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])

[locationManager requestWhenInUseAuthorization];

[[self worldView] setShowsUserLocation:YES];

}else { ... }

}

Étienne Payet (DMI) Programmation iOS – M1 informatique 56 / 90

Exemple : afficher sa position sur une carte

ViewController.m- (IBAction)ouSuisJe:(id)sender {

CLLocationCoordinate2D location = [currentLocation coordinate];MKCoordinateRegion region =

MKCoordinateRegionMakeWithDistance(location, 5000, 5000);[[self worldView] setRegion:region animated:YES];

}

- (void)mapView:(MKMapView *)mapViewdidUpdateUserLocation:(MKUserLocation *)userLocation {

currentLocation = [userLocation location];}

Étienne Payet (DMI) Programmation iOS – M1 informatique 57 / 90

Types de cartes

propriété mapType (de type NSUInteger) de la classe MKMapView

3 valeurs possibles :MKMapTypeStandard (plan)MKMapTypeSatelliteMKMapTypeHybrid

Étienne Payet (DMI) Programmation iOS – M1 informatique 58 / 90

Exercice

le bouton « Où suis-je » affiche laposition du terminal

les autres boutons permettent dechanger le type de la carte

Étienne Payet (DMI) Programmation iOS – M1 informatique 59 / 90

Annoter une carte

créer une classe se conformant au protocole MKAnnotation

méthode de la classe MKMapView :

- (void)addAnnotation:(id < MKAnnotation >)annotation

Étienne Payet (DMI) Programmation iOS – M1 informatique 60 / 90

Protocole MKAnnotation

ensemble d’éléments pour les classes dont des instances sont affichées surune carte

@protocol MKAnnotation <NSObject>

@required

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

@optional

@property (nonatomic, readonly, copy) NSString *title;@property (nonatomic, readonly, copy) NSString *subtitle

@end

Étienne Payet (DMI) Programmation iOS – M1 informatique 61 / 90

Épingle

instance de la classe MKPinAnnotationView

une vue (callout) est affichée lorsqu’on effectue un tap sur une épingle

méthodes du protocole MKMapViewDelegate :

- (MKAnnotationView*)mapView:(MKMapView *)mapViewviewForAnnotation:(id<MKAnnotation>)annotation

- (void)mapView:(MKMapView *)mapViewannotationView:(MKAnnotationView *)viewcalloutAccessoryControlTapped:(UIControl *)control

Étienne Payet (DMI) Programmation iOS – M1 informatique 62 / 90

Épingle

- (MKAnnotationView*)mapView:(MKMapView *)mapViewviewForAnnotation:(id<MKAnnotation>)annotation {

if (annotation == [mapView userLocation]) return nil;

MKPinAnnotationView *pin =[[MKPinAnnotationView alloc] initWithAnnotation:annotation

reuseIdentifier:@"dmi"];[pin setPinColor:MKPinAnnotationColorRed];[pin setCanShowCallout:YES];[pin setRightCalloutAccessoryView:

[UIButton buttonWithType:UIButtonTypeDetailDisclosure]];

return pin;}

Étienne Payet (DMI) Programmation iOS – M1 informatique 63 / 90

Épingle

- (void)mapView:(MKMapView *)mapViewannotationView:(MKAnnotationView *)viewcalloutAccessoryControlTapped:(UIControl *)control {

CLLocationCoordinate2D coo = [[view annotation] coordinate];NSLog(@"Lat: %2.3f, Long: %2.3f", coo.latitude, coo.longitude);

}

Étienne Payet (DMI) Programmation iOS – M1 informatique 64 / 90

Exercice

Étienne Payet (DMI) Programmation iOS – M1 informatique 65 / 90

Exercice

un tap sur le i© affiche la position de lapunaise dans la zone de texte

Étienne Payet (DMI) Programmation iOS – M1 informatique 66 / 90

Plan

1 Internationalisation

2 Protocoles et délégation

3 Géolocalisation

4 La classe CMMotionManager

5 Lecture audio

6 Gestes courants

7 Appareil photo

Étienne Payet (DMI) Programmation iOS – M1 informatique 67 / 90

La classe CMMotionManager

mesure de données liées au déplacement du terminal

accéléromètre : accélération (force en G sur les 3 axes)

gyroscope : orientation (rotation sur les 3 axes en radians/seconde)

magnétomètre : champ magnétique (en µT sur les 3 axes)

ne créer qu’une seule instance par application

CMMotionManager *manager = [[CMMotionManager alloc] init];

importer le framework CoreMotion

Étienne Payet (DMI) Programmation iOS – M1 informatique 68 / 90

Données brutes

classes CMAccelerometerData, CMGyroData, CMMagnetometerData

fixer l’intervalle de mesure : setAccelerometerUpdateInterval,setGyroUpdateInterval, setMagnetometerUpdateInterval (argumentde type NSTimeInterval)

démarrage des mesures : startAccelerometerUpdates,startGyroUpdates, startMagnetometerUpdates

arrêt des mesures : stopAccelerometerUpdates, stopGyroUpdates,stopMagnetometerUpdates

propriétés booléennes : accelerometerActive, accelerometerAvailable,gyroActive, gyroAvailable, magnetometerActive, magnetometerAvailable

Étienne Payet (DMI) Programmation iOS – M1 informatique 69 / 90

Données pré-traitées

classe CMDeviceMotion

fixer l’intervalle de mesure : setDeviceMotionUpdateInterval(argument de type NSTimeInterval)

démarrage des mesures : startDeviceMotionUpdates

arrêt des mesures : stopDeviceMotionUpdates

propriétés booléennes : deviceMotionActive, deviceMotionAvailable

Étienne Payet (DMI) Programmation iOS – M1 informatique 70 / 90

Récupération des données

données brutes : voir la documentation

données pré-traitées (ici manager est instance de CMMotionManager) :

- (void)maj {CMAcceleration acceleration =

[[manager deviceMotion] userAcceleration];NSLog(@"x = %f G", acceleration.x);

CMRotationRate rotation = [[manager deviceMotion] rotationRate];NSLog(@"x = %f rad/s", rotation.x);

CMCalibratedMagneticField magneticField =[[manager deviceMotion] magneticField];

NSLog(@"x = %f µT", magneticField.field.x);}

Étienne Payet (DMI) Programmation iOS – M1 informatique 71 / 90

Récupération des données

quand on en a besoin

on peut utiliser un NSTimer pour des récupérations régulières :NSTimeInterval intervalle = 1.0;NSTimer *alarme =

[NSTimer scheduledTimerWithTimeInterval:intervalletarget:self

selector:@selector(maj)userInfo:nilrepeats:YES];

Étienne Payet (DMI) Programmation iOS – M1 informatique 72 / 90

Exercice

Étienne Payet (DMI) Programmation iOS – M1 informatique 73 / 90

Plan

1 Internationalisation

2 Protocoles et délégation

3 Géolocalisation

4 La classe CMMotionManager

5 Lecture audio

6 Gestes courants

7 Appareil photo

Étienne Payet (DMI) Programmation iOS – M1 informatique 74 / 90

La classe AVAudioPlayer

lecture d’un fichier audio

inclure le framework AVFoundation

importer AVFoundation/AVFoundation.h

initialisation :- (instancetype)initWithContentsOfURL:(NSURL *)url

error:(NSError **)outError;- (instancetype)initWithData:(NSData *)data

error:(NSError **)outError;

actions :- (BOOL)play; - (BOOL)prepareToPlay;- (void)pause; - (void)stop;

Étienne Payet (DMI) Programmation iOS – M1 informatique 75 / 90

Le protocole AVAudioPlayerDelegate

méthodes :

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)playersuccessfully:(BOOL)flag;

- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)playererror:(NSError *)error;

Étienne Payet (DMI) Programmation iOS – M1 informatique 76 / 90

Exemple

ViewController.h#import <AVFoundation/AVFoundation.h>

@interface ViewController : UIViewController <AVAudioPlayerDelegate> {AVAudioPlayer *myPlayer;

}

- (IBAction)jouerUnSon:(id)sender;

@end

Étienne Payet (DMI) Programmation iOS – M1 informatique 77 / 90

Exemple

ViewController.m- (void)viewDidLoad {

[super viewDidLoad];

NSError *error;NSString *soundFilePath =

[[NSBundle mainBundle] pathForResource:@"son"ofType:@"mp3"];

NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];myPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL

error:&error];

if (myPlayer) [myPlayer setDelegate:self];else {

UIAlertView *alert = [[UIAlertView alloc] ...];[alert show];

}}

Étienne Payet (DMI) Programmation iOS – M1 informatique 78 / 90

Exemple

ViewController.m- (IBAction)jouerUnSon:(id)sender {

[mPlayer play];}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)playersuccessfully:(BOOL)flag {

if (!flag) {UIAlertView *alert = [[UIAlertView alloc]

initWithTitle:@"Erreur" ...];[alert show];

}}

Étienne Payet (DMI) Programmation iOS – M1 informatique 79 / 90

Exercice

la balle se déplace sur l’écran enfonction de l’inclinaison de l’appareil,elle ne sort pas de l’écran

le UISwitch active/désactive ledéplacement de la balle

le UIStepper modifie la vitesse

lorsqu’on secoue l’appareil, la ballechange de couleur

lorsque la balle touche le bord del’écran, un son est émis

Étienne Payet (DMI) Programmation iOS – M1 informatique 80 / 90

Plan

1 Internationalisation

2 Protocoles et délégation

3 Géolocalisation

4 La classe CMMotionManager

5 Lecture audio

6 Gestes courants

7 Appareil photo

Étienne Payet (DMI) Programmation iOS – M1 informatique 81 / 90

Gestes courants

iOS propose des classes permettant de gérer les gestes courants (appuilong, tap, balayage, pinch, rotation. . . ) :

UILongPressGestureRecognizerUITapGestureRecognizerUISwipeGestureRecognizerUIPinchGestureRecognizerUIRotationGestureRecognizer...

ces classes héritent de la classe UIGestureRecognizer

Étienne Payet (DMI) Programmation iOS – M1 informatique 82 / 90

UIGestureRecognizer

on initialise une instance de UIGestureRecognizer avec la méthode

initWithTarget:action:

paramètres = objet cible et méthode à invoquer lorsque le geste estreconnu

la méthode à invoquer doit avoir la forme :- (void)nom:(UIGestureRecognizer *)recognizer

Étienne Payet (DMI) Programmation iOS – M1 informatique 83 / 90

Ajout d’un geste à une vue

pour qu’une vue reconnaisse un geste, on appelle la méthode de UIView

- (void)addGestureRecognizer:(UIGestureRecognizer *)recognizer

paramètre = instance de UIGestureRecognizer correspondant au gestesouhaité

Étienne Payet (DMI) Programmation iOS – M1 informatique 84 / 90

Exemple : double tap

dans une sous-classe de UIViewController :

- (void)viewDidLoad {...UITapGestureRecognizer *tapDetect =

[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapDetection:)];

[tapDetect setNumberOfTapsRequired:2];[[self view] addGestureRecognizer:tapDetect];...

}

-(void)tapDetection:(UITapGestureRecognizer *)tapDetect {[[self monLabel] setText:@"Double tap détecté !"];

}

Étienne Payet (DMI) Programmation iOS – M1 informatique 85 / 90

Propriétés spécifiques

chaque sous-classe de UIGestureRecognizer dispose de propriétésspécifiques

exemples :UILongPressGestureRecognizer : minimumPressDurationUITapGestureRecognizer : numberOfTapsRequiredUIRotationGestureRecognizer : rotation. . .

voir la documentation

Étienne Payet (DMI) Programmation iOS – M1 informatique 86 / 90

Exercice

écrivez une application qui affiche un message à l’écran lorsque l’un desgestes suivants est reconnu :

double tappression longuebalayagepinchrotation

Étienne Payet (DMI) Programmation iOS – M1 informatique 87 / 90

Exercice : jeu du taquin à 9 cases

https://fr.wikipedia.org/wiki/Taquin

le déplacement d’une case se fait par unmouvement de balayage (swipe)

un son est émis lorsqu’une case estdéplacée

un double tap permet de recommencerla partie en cours

lorsque l’appareil est secoué, le jeu estmélangé et une nouvelle partie démarre

gérer la rotation de l’écran (modesportrait et paysage autorisés)

Étienne Payet (DMI) Programmation iOS – M1 informatique 88 / 90

Plan

1 Internationalisation

2 Protocoles et délégation

3 Géolocalisation

4 La classe CMMotionManager

5 Lecture audio

6 Gestes courants

7 Appareil photo

Étienne Payet (DMI) Programmation iOS – M1 informatique 89 / 90

Capture et sauvegarde d’une photo

2 possibilités :

utiliser la classe UIImagePickerController pour prendre et éditerune photo en utilisant le logiciel de capture fourni par iOS

créer son propre logiciel de capture

détails :

http://developer.apple.com/library/ios/#documentation/AudioVideo/

Conceptual/CameraAndPhotoLib_TopicsForIOS/Introduction/Introduction.html

Étienne Payet (DMI) Programmation iOS – M1 informatique 90 / 90