“Posibilidades” que ofrece el Sensores del iPhone hardware...

10
“Posibilidades” que ofrece el hardware en el iPhone 25 febrero Ana C. Murillo Índice Sensores del iPhone Multitouch Vistas web, mapas, localización Giróscopo, acelerómetro Cámara Sensores del iPhone Localización & vistas-web Cámara Acelerómetros, giroscopo Multi-touch Eventos UIEvent : Eventos de (multi-)touch, de movimiento y del control-remoto .type typedef enum { UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteControl,} UIEventType; .subtype typedef enum { UIEventSubtypeNone UIEventSubtypeMotionShake UIEventSubtypeRemoteControlPlay UIEventSubtypeRemoteControlPause UIEventSubtypeRemoteControlStop UIEventSubtypeRemoteControlTogglePlayPause UIEventSubtypeRemoteControlNextTrack UIEventSubtypeRemoteControlPreviousTrack UIEventSubtypeRemoteControlBeginSeekingBackward UIEventSubtypeRemoteControlEndSeekingBackward UIEventSubtypeRemoteControlBeginSeekingForward UIEventSubtypeRemoteControlEndSeekingForward} UIEventSubtype;

Transcript of “Posibilidades” que ofrece el Sensores del iPhone hardware...

Page 1: “Posibilidades” que ofrece el Sensores del iPhone hardware ...webdiis.unizar.es/~anacris/curso_ai2/SensoresYeventos.pdf · Para los gestos típicos, más fácil! UIGestureRecognizer

“Posibilidades” que ofrece el hardware en el iPhone!

25 febrero!

Ana C. Murillo!

Índice!

Sensores del iPhone!

• Multitouch!

• Vistas web, mapas, localización!

• Giróscopo, acelerómetro!

• Cámara!

Sensores del iPhone!Localización &

vistas-web!Cámara! Acelerómetros, giroscopo!

Multi-touch!

Eventos!UIEvent : Eventos de (multi-)touch, de movimiento y del control-remoto.typetypedef enum { UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteControl,} UIEventType;.subtypetypedef enum { UIEventSubtypeNone UIEventSubtypeMotionShake UIEventSubtypeRemoteControlPlay UIEventSubtypeRemoteControlPause UIEventSubtypeRemoteControlStop UIEventSubtypeRemoteControlTogglePlayPause UIEventSubtypeRemoteControlNextTrack UIEventSubtypeRemoteControlPreviousTrack UIEventSubtypeRemoteControlBeginSeekingBackward UIEventSubtypeRemoteControlEndSeekingBackward UIEventSubtypeRemoteControlBeginSeekingForward UIEventSubtypeRemoteControlEndSeekingForward} UIEventSubtype;

Page 2: “Posibilidades” que ofrece el Sensores del iPhone hardware ...webdiis.unizar.es/~anacris/curso_ai2/SensoresYeventos.pdf · Para los gestos típicos, más fácil! UIGestureRecognizer

Eventos (multi)-touch!

•  UIControlEvents (código o IB)!

(UIControl es la clase “base” para objetos de “control”: botones,…)!

Qué es cada evento? (ejemplo: ControlDemo)!

UIControlEventTouchDown

UIControlEventTouchDownRepeat

UIControlEventTouchDragInside

UIControlEventTouchDragOutside

UIControlEventTouchDragEnter

UIControlEventTouchDragExit

UIControlEventTouchUpInside

UIControlEventTouchUpOutside

UIControlEventTouchCancel

Eventos (multi)-touch!UITouch: representa un toque (un dedo sólo)!

@property(nonatomic,readonly) NSTimeInterval timestamp;

@property(nonatomic,readonly) UITouchPhase phase; (inicio, moviendo, parado, fin) @property(nonatomic,readonly) NSUInteger tapCount;

@property(nonatomic,readonly,retain) UIWindow *window;

@property(nonatomic,readonly,retain) UIView *view;- (CGPoint)locationInView:(UIView *)view; - (CGPoint)previousLocationInView:(UIView *)view;

UIEvent: contiene un conjunto de “toques”!@property(nonatomic,readonly) NSTimeInterval timestamp;-(NSSet *)allTouches;

-(NSSet *)touchesForWindow:(UIWindow *)window; -(NSSet *)touchesForView:(UIView *)view;

UIResponder: interface para objetos! ! !! que manejen eventos !(super de UIApplication, UIView, UIWindow…)!

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; -  (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

Eventos (multi)-touch!• Activar en UIView : property BOOL multipleTouchEnabled;!

Multiple-touch en una vista!

Touchs en varias vistas!

Eventos (multi)-touch!• Las subclases de UIView y UIViewController deben manejar (implementar)

todos los métodos relacionados con “touch” (y no se lo pasan al super), aunque sea null.!

-  (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

-  (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

• Las demás subclases de elementos de UIKit pueden implementar los que se quiera, pero además deben pasar el evento al super! ! !![super touchesBegan:theTouches withEvent:theEvent];

Page 3: “Posibilidades” que ofrece el Sensores del iPhone hardware ...webdiis.unizar.es/~anacris/curso_ai2/SensoresYeventos.pdf · Para los gestos típicos, más fácil! UIGestureRecognizer

Eventos (multi)-touch!

Ejemplo: MultiTouchDemo !

Eventos (multi)-touch!

Para los gestos típicos, más fácil! UIGestureRecognizer (abstract)

Actua de”supervisor” cada vez que ocurre un UITouch en una vista:!

UIView: @property(nonatomic,copy) NSArray *gestureRecognizers

subclasses de UIGestureRecognizer !•  UITapGestureRecognizer•  UIPinchGestureRecognizer•  UIRotationGestureRecognizer•  UISwipeGestureRecognizer•  UIPanGestureRecognizer•  UILongPressGestureRecognizer

Eventos (multi)-touch!

UIPanGestureRecognizer–"translationInView:!–"setTranslation:inView:!–"velocityInView:!

UIPinchGestureRecognizer@property CGFloat scale; !@property (readonly) CGFloat velocity!

UIRotationGestureRecognizer@propertyCGFloatrotation!@property (readonly) CGFloat velocity; !

UISwipeGestureRecognizer@property UISwipeGestureRecognizerDirection direction!@property NSUInteger numberOfTouchesRequired;!

UITapGestureRecognizer@property NSUInteger numberOfTapsRequired;!@property NSUInteger numberOfTouchesRequired;!

UILongPressGestureRecognizer@property(nonatomic) CFTimeInterval minimumPressDuration;!

! ! Los gestos tienen distintas propiedades y métodos para configurar y manejarlos. Algunos son:!Todos tienen!@property (readonly) UIGestureRecognizerState state; !(Possible, Began, Changed, Ended, Cancelled, Failed, Recognized)!

Se pueden “programar” nuevos “gestureRecognizer”!

Eventos (multi)-touch!

Añadir gestureRecognizer a UIView desde un Controller!

- (void)viewDidLoad{

UIView*panView=...; //Vista del controlador donde queremos reconocer gestos

UIGestureRecognizer *pangr = [[UIPanGestureRecognizer alloc] initWithTarget:panView action:@selector(pan:)];

[panView addGestureRecognizer:pangr];

[pangr release];}

•  UIView: reconocer gestos !•  Cualquier objeto: pedir a UIView que reconozca gestos (mensaje “addGesture…”). !•  Normalmente UIView maneja los gestos reconocidos (no es obligatorio)!

Método del “target” para manejar el gesto!

Page 4: “Posibilidades” que ofrece el Sensores del iPhone hardware ...webdiis.unizar.es/~anacris/curso_ai2/SensoresYeventos.pdf · Para los gestos típicos, más fácil! UIGestureRecognizer

Definir como “procesar” el evento!

- (void)pan:(UIPanGestureRecognizer *)recognizer{

if ((sender.state == UIGestureRecognizerStateChanged) || (sender.state == UIGestureRecognizerStateEnded)) { CGPoint translation = [recognizer translationInView:self];

! // mover algun elemento de la vista “afectada” (translation.x, translation.y)!! // e.g. si estamos en un grafico y el origen es una “property” origin!

self.origin = CGPointMake(self.origin.x+translation.x, self.origin.y+translation.y)

[recognizer setTranslation:CGPointZero inView:self]; }}

Eventos (multi)-touch!

Ejemplo Touches

Eventos (multi)-touch!

Eventos de movimiento! Eventos de movimiento!

Datos “preprocesados”!

•  Evento“agitar”: UIEvent type;!@property(readonly) UIEventType @property(readonly) UIEventSubtype subtype; !

UIEventTypeMotion UIEventSubtypeMotionShake!

•  Para “manejar” este evento: subclase de UIResponder que implemente!

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {} !

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event!

-(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event {} !

Y además sea “first responder”!-  (BOOL)canBecomeFirstResponder {! return YES;! }!-  (void)viewDidAppear:(BOOL)animated {! [self becomeFirstResponder];! }! !

Page 5: “Posibilidades” que ofrece el Sensores del iPhone hardware ...webdiis.unizar.es/~anacris/curso_ai2/SensoresYeventos.pdf · Para los gestos típicos, más fácil! UIGestureRecognizer

Eventos de movimiento!Otros datos “preprocesados” de movimiento!•  La orientación de las pantallas:!

en la clase UIApplication: statusBarOrientation (interface, no device orientation)!

en la clase UIViewController: propiedad interfaceOrientation !

- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation!

•  La orientación “real” del dispositivo: clase UIDevice **!! - Arrancar notificaciones: beginGeneratingDeviceOrientationNotifications!

Evento de cambio de orientación: UIDeviceOrientationDidChangeNotification (para “observadores registrados”)!" [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; !" [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector" (orientationChanged:)name:UIDeviceOrientationDidChangeNotification object:nil]; !

ó acceder a propiedad orientation!

! - Parar notificaciones: endGeneratingDeviceOrientationNotifications!

Eventos de movimiento!** !

clase UIDevice tambien proporciona:!(Instancia única +#currentDevice)!

•  Opciones disponibles, versión, ID, OS … del dispositivo: !multitaskingSupported uniqueIdentifier  name  systemName  systemVersion  model 

•  Estado de la batería: batteryLevel  batteryMonitoringEnabled batteryState  

•  Sensor de proximidad: proximityMonitoringEnabled proximityState !

Eventos de movimiento!

Ejemplo: AlternateViews!

“Control” de movimiento!Para eventos de movimiento mas detallados:!

Core Motion: acelerómetro y giróscopo !(sólo iPhone4 y iPod Touch nuevo).!antes UIAccelerometer class, esto es mas “completo”!

CMMotionManager:-  solo una instancia por aplicación pero es un recurso para “todos”!-  dos modos: samplear periódicamente la medición más reciente o suscribir un “manejador” para recibir todos los updates. (samplear más eficiente, mejor, salvo que “no se pueda perder ni una medida”)!

Page 6: “Posibilidades” que ofrece el Sensores del iPhone hardware ...webdiis.unizar.es/~anacris/curso_ai2/SensoresYeventos.pdf · Para los gestos típicos, más fácil! UIGestureRecognizer

1 – Comprobar disponibilidad del hardware! ! ! ! @property (readonly) BOOL {accelerometer,gyro,deviceMotion}Available;

2 – Empezar la “captura” de datos.! - (void)start{Accelerometer,Gyro,DeviceMotion}Updates; (SOLO si vamos a acceder a los datos)

@property (readonly) BOOL {accelerometer,gyro,deviceMotion}Active; (comprobar si esta “en marcha”)

3 – “desconectar” la captura (cuanto antes!! ahorro de bateria)! - (void)stop{Accelerometer,Gyro,DeviceMotion}Updates;

Control de movimiento #(Core Motion)!

Acceder a los datos “en crudo”!

@property (readonly) CMAccelerometerData *accelerometerData;!Que contiene: @property (readonly) CMAcceleration acceleration;!typedef struct {double x;double y;double z;}CMAcceleration; !(incluye gravedad)!

@property (readonly) CMGyroData *gyroData;!Que contiene: @property (readonly) CMRotationRate rotationRate; !typedef struct { double x; double y; double z;} CMRotationRate; !(tiene un bias)!

@property (readonly) CMDeviceMotion *deviceMotion; (combinación de medida del gyro y acelerómetros)!

Control de movimiento #(Core Motion)!

Acceder a los datos “filtrados” instanciando CMDeviceMotion!

Datos de aceleración!@property (readonly) CMAcceleration gravity; !

@property(readonly) CMAccelerationuser Acceleration; !" //sin el “factor” gravedad gracias al giróscopo !typedef struct { double x; double y; double z; } CMAcceleration; // x, y, z in “g” !

Datos de rotación!@property CMRotationRate rotationRate; !" //sin bias respecto a datos “crudos” gracias al acelerómetro !typedef struct {double x;double y;double z;} CMRotationRate; !

@property CMAttitude *attitude; //orientación en 3D del dispositivo !

Control de movimiento #(Core Motion)!

Control de movimiento #(Core Motion)!

Activar y samplear después (normalmente en bucle de aplicación)!

- (void)startAccelerometerUpdates; !@property NSTimeInterval accelerometerUpdateInterval; !

- (void)startGyroUpdates; !@property NSTimeInterval gyroUpdateInterval; !

- (void)startDeviceMotionUpdates; !@property NSTimeInterval deviceMotionUpdateInterval; !

A partir de aquí, Core Motion actualiza la propiedad correspondiente del “UIMotionManager” con la medida más actual.!

Page 7: “Posibilidades” que ofrece el Sensores del iPhone hardware ...webdiis.unizar.es/~anacris/curso_ai2/SensoresYeventos.pdf · Para los gestos típicos, más fácil! UIGestureRecognizer

Control de movimiento #(Core Motion)!

Registrar “bloques” para recibir “updates” de las medidas (métodos del único CMMotionManager)!

- (void)startAccelerometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMAccelerometerHandler)handler; !

- (void)startGyroUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMGyroHandler)handler; !

- (void)startDeviceMotionUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMDeviceMotionHandler)handler; !

Mostrar contenido web!

Mostrar contenido web!Usamos UIWebView (subclase de UIView)!

• Un navegador dentro de una “View”: no sólo HTML, también otros ficheros como PDF, imágenes,...!

• Distintos contenidos: !

cadena HTML local: !

datos + MIME type:!

URL remota:!

• Permite: cargar y navegar, delegar parte de los controles, ejecutar JavaScript (5 sec. de ejecución y hasta 10 MB de memoria)!

- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingNamebaseURL:(NSURL *)baseURL;MIME: Multimedia Internet Mail Extensionmanera standard para denominar ciertos tipos de ficheros (PDF,...)NSURL: básicamente NSString, con un formato obligado, p.ej. “file://...” or “http://...”

- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL;

- (void)loadRequest:(NSURLRequest *)request;

UIWebView!

@property BOOL loading; !

@property BOOL canGoBack; !

@property BOOL canGoForward;!

@property BOOL scalesPageToFit; !

@property UIDataDetectorTypes dataDetectorTypes; !

(UIDataDetectorTypePhoneNumber/Link/Address/CalendarEvent: abre automático lo que corresponda)!

Capacidades de “browser”!

- (void)reload; !

- (void)stopLoading; !

- (void)goBack; !

- (void)goForward;!

! !

Mostrar contenido web!

Page 8: “Posibilidades” que ofrece el Sensores del iPhone hardware ...webdiis.unizar.es/~anacris/curso_ai2/SensoresYeventos.pdf · Para los gestos típicos, más fácil! UIGestureRecognizer

Usamos MKMapView (subclase de UIView)!

• Muestra un mapa (googleMaps)!

• Con anotaciones, que se muestran con MKAnnotationView (e.g. MKPinAnnotationView, cualquier objeto puede ser una anotación siempre que implemente el protocolo MKAnnotation (tiene coordenadas y opcional título y subtítulo) !

• Cada anotación: puede ventana/mensaje asociada al hacer click. Por defecto: título y subtítulo. Se pueden añadir elementos a los lados (aquí UIImageView a izq., UIButton a dch.)!

Mapas Web: MAP KIT!• MKAnnotationView: “view” que dibuja el pin o marcador de la

anotación en el mapa.!

• Muy flexible: !

-  configurar el tipo de mapa (@property MKMapType), mostrar posición de usuario (@property BOOL showsUserLocation), !

-  controlar región de mapa mostrada (@property MKCoordinateRegion region), !

-  pasar de latitud-longitud a posición de mapa, y viceversa ( -(CGPoint)convertCoordinate:(CLLocationCoordinate2D)coord

toPointToView:(UIView *)view;)!

• MKMapViewDelegate para manejar cambios en la región mostrada!

Mapas Web: MAP KIT!

•  Localización de 3 sensores: GPS + Wifi + Red de móviles. Cuanto más preciso más gasto de bateria. Se comprueban/complementan todos los posibles.!

•  Clase básica: CLLocation!

@property (readonly) CLLocationCoordinate2D coordinate; !@property(readonly) CLLocationDistance altitude; !

@property (readonly) CLLocationAccuracy horizontalAccuracy; // metros!@property (readonly) CLLocationAccuracy verticalAccuracy; // metros!(kCLLocationAccuracyBestForNavigation; kCLLocationAccuracyBest; kCLLocationAccuracyNearestTenMeters;

kCLLocationAccuracyHundredMeters; kCLLocationAccuracyKilometer; kCLLocationAccuracyThreeKilometers;) !

Y velocidad, orientación, timestamp,… !

- (CLLocationDistance)distanceFromLocation:(CLLocation *)otherLocation; //metros !

localización: CORE LOCATION!

Crear un CLLocationManager: alloc/init + configurar + arrancar!

• Comprobar que tenemos el hardware necesario.!" @property BOOL headingAvailable; !" @property BOOL locationServicesEnabled; !

• Crear CLLocationManager y establecer el “delegado”.!" CLLocationManager *clm = [[CLLocationManager alloc] init]; !

" @property(assign, nonatomic) id <CLLocationManagerDelegate> delegate;!

• Configurar el manager!clm.distanceFilter=10.0; //minimumdistancechangetoreport,inmeters !clm.desiredAccuracy = kCLLocationAccuracyTenMeters; !

•  Arrancar la monitorización de los cambios:!! Monitorización continua: ! [clm startUpdatingLocation]; !

" Monitorización de cambios “significativos”: - (void)startMonitoringSignificantLocationChanges; !" Monitorización por zonas: - (void)startMonitoringForRegion:(CLRegion *) desiredAccuracy:(CLLocationAccuracy);!" Monitorización de la orientación:! - (void)startUpdatingHeading; !

localización: CORE LOCATION!

Page 9: “Posibilidades” que ofrece el Sensores del iPhone hardware ...webdiis.unizar.es/~anacris/curso_ai2/SensoresYeventos.pdf · Para los gestos típicos, más fácil! UIGestureRecognizer

• El delegado del “manager recibira las notificaciones, por ejemplo:!- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)

newLocationfromLocation:(CLLocation *)oldLocation; !

-  (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading; !

• También se puede acceder directamente!CLLocation *location = clm.location; !CLHeading *heading = clm.heading; !

• Manejar errores/interferencias!

• Solicitar permiso al usuario para usar servicios de localización!

localización: CORE LOCATION! localización: CORE LOCATION!

Ejemplo Locations!

Acceso a la cámara!

• Clase UIImagePickerController (sin subclases, maneja interacciones con los UIViewController)!

• Protocolo UIImagePickerControllerDelegate (implementado por el delegado)!

• Configurar : ¿qué ocurre si se acepta la imagen o se cancela? ¿se puede editar antes de aceptar?!

• Comprobar disponibilidad de cámara: seleccionar imagen del dispositivo disponible (cámara o archivo). !

Acceso a la cámara!

Page 10: “Posibilidades” que ofrece el Sensores del iPhone hardware ...webdiis.unizar.es/~anacris/curso_ai2/SensoresYeventos.pdf · Para los gestos típicos, más fácil! UIGestureRecognizer

Acceso a la cámara!

DEMO: añadir imagen desde archivo!

Acceso a la cámara!

Ejemplo: PhotoPicker!

Recordar …!

CUIDADO! con el gasto de batería: desconectar servicios en cuanto no se estén utilizando.!