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