Page 1
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
Page 2
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
Page 3
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
Page 4
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
Page 5
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
Page 6
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
Page 7
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
Page 8
Exercice
Étienne Payet (DMI) Programmation iOS – M1 informatique 8 / 90
Page 9
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
Page 10
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
Page 11
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
Page 12
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
Page 13
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
Page 14
Exercice : ajout d’une barre d’outils à l’exercice précédent
Étienne Payet (DMI) Programmation iOS – M1 informatique 14 / 90
Page 15
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
Page 16
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
Page 17
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
Page 18
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
Page 19
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
Page 20
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
Page 21
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
Page 22
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
Page 23
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
Page 24
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
Page 25
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
Page 26
Exercice
Étienne Payet (DMI) Programmation iOS – M1 informatique 26 / 90
Page 27
Exemple délegation : UIActionSheet
Étienne Payet (DMI) Programmation iOS – M1 informatique 27 / 90
Page 28
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
Page 29
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
Page 30
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
Page 31
Autre exemple délegation : UIAlertView
Étienne Payet (DMI) Programmation iOS – M1 informatique 31 / 90
Page 32
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
Page 33
Exercice : extension de l’exercice précédent
Étienne Payet (DMI) Programmation iOS – M1 informatique 33 / 90
Page 34
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
Page 35
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
Page 36
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
Page 37
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
Page 38
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
Page 39
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
Page 40
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
Page 41
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
Page 42
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
Page 43
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
Page 44
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
Page 45
Un nouveau système de permission depuis iOS8
alerte WhenInUse alerte Always
Étienne Payet (DMI) Programmation iOS – M1 informatique 45 / 90
Page 46
Exercice
détection des changements de position
l’affichage tient compte de la langue
Étienne Payet (DMI) Programmation iOS – M1 informatique 46 / 90
Page 47
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
Page 48
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
Page 49
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
Page 50
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
Page 51
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
Page 52
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
Page 53
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
Page 54
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
Page 55
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
Page 56
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
Page 57
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
Page 58
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
Page 59
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
Page 60
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
Page 61
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
Page 62
É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
Page 63
É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
Page 64
É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
Page 65
Exercice
Étienne Payet (DMI) Programmation iOS – M1 informatique 65 / 90
Page 66
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
Page 67
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
Page 68
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
Page 69
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
Page 70
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
Page 71
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
Page 72
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
Page 73
Exercice
Étienne Payet (DMI) Programmation iOS – M1 informatique 73 / 90
Page 74
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
Page 75
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
Page 76
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
Page 77
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
Page 78
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
Page 79
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
Page 80
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
Page 81
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
Page 82
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
Page 83
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
Page 84
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
Page 85
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
Page 86
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
Page 87
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
Page 88
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
Page 89
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
Page 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