Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2012-13 Depto. Ciencia de la Computación e IA
Sensores
Sesión 3: Sensores en iOS
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Índice de contenidos• Pantalla táctil• Gestión de eventos de entrada• Reconocimiento de gestos multitáctiles
• Acelerómetro• Implementación
• Giroscopio• Implementación
• Brújula• Implementación
• GPS• Implementación
• Proximidad y sensor de luz ambiente• Implementación
2
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Pantalla táctil• Pantalla táctil• Gestión de eventos de entrada• Reconocimiento de gestos multitáctiles
3
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Gestión de eventos de entrada (1)• Sensor más usado• Eventos de entrada básicos implementados por defecto en UIKit• Uso en tablas (selección de celdas, arrastre...)• Botones• etc.
• Captura de eventos de entrada (Touch Events):• Implementación de los siguientes métodos:
4
- (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
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Gestión de eventos de entrada (2)• Obtener posición de la pulsación:
• Comprobaciones:• ¿Hemos pulsado dentro de un objeto?
Devuelve true si el rectángulo contiene el punto
5
UITouch *touch = [touches anyObject];CGPoint loc = [touch locationInView:self.view];
CGRectContainsPoint(objeto.frame, loc)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Pantalla táctil• Pantalla táctil• Gestión de eventos de entrada• Reconocimiento de gestos multitáctiles
6
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Gestos multitáctiles• Clases UIGestureRecognizer• Implementar el protocolo UIGestureRecognizerDelegate
• Tipos de gestos:• Toque simple: UITapGestureRecognizer• Pellizco: UIPinchGestureRecognizer• Rotación: UIRotationGestureRecognizer• Movimiento lateral: UISwipeGestureRecognizer• Pulsar y arrastrar: UIPanGestureRecognizer• Pulsado largo: UILongPressGestureRecognizer
7
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
UITapGestureRecognizer• Toque sencillo en pantalla.• Definición:
• Detección:
8
UITapGestureRecognizer * recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];recognizer.delegate = self;[self.imagen addGestureRecognizer:recognizer];
- (void)handleTap:(UITapGestureRecognizer *)recognizer { NSLog(@"Hemos tocado la imagen");}
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
UIPinchGestureRecognizer• Gesto de pellizcar• Definición:
• Detección:
9
UIPinchGestureRecognizer *recognizerPinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
recognizerPinch.delegate = self;[self.imagenLogo addGestureRecognizer:recognizerPinch];
- (void)handlePinch:(UIPinchGestureRecognizer *)recognizer { recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
recognizer.scale = 1; }
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
UIRotationGestureRecognizer• Gesto de rotación (uso de los dos dedos)• Definición:
• Detección:
10
UIRotationGestureRecognizer *recognizerRotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotate:)]; recognizerRotation.delegate = self; [self.imagenLogo addGestureRecognizer:recognizerRotation];
- (void)handleRotate:(UIRotationGestureRecognizer *)recognizer { recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation); }
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
UISwipeGestureRecognizer• Gesto de arrastre lateral• Definición:
• Detección:
11
UISwipeGestureRecognizer *pressGestureLeft = [[[UISwipeGestureRecognizer alloc] initWithTarget: self action:@selector(handleSwipe:)];
[pressGestureLeft setDirection:UISwipeGestureRecognizerDirectionLeft];[self.view addGestureRecognizer:pressGestureLeft];
- (void) handleSwipe:(UISwipeGestureRecognizer *)recognizer {
if (gesture.direction == UISwipeGestureRecognizerDirectionLeft){
//Implementamos la acción } }
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
UIPanGestureRecognizer• Gesto de pulsar y arrastrar• Definición:
• Detección:
12
UIPanGestureRecognizer * recognizerPan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];recognizerPan.delegate = self;[self.imagenLogo addGestureRecognizer:recognizerPan];
- (void)handlePan:(UIPanGestureRecognizer *)recognizer { CGPoint translation = [recognizer translationInView:self.view];
recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y); [recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; }
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
UILongPressGestureRecognizer• Gesto de pulsación larga• Definición:
• Detección:
13
UILongPressGestureRecognizer *gestureRecognizer=[[UILongPressGestureRecognizer alloc] initWithTarget: self action:@selector(handleLongGesture:)];
[view addGestureRecognizer:gestureRecognizer];
- (void) handleLongGesture:(UILongPressGestureRecognizer *)recognizer { //Implementar acción... }
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Acelerómetro• Acelerómetro• Implementación
14
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Acelerómetro• Sensor mediante el cual obtenemos la aceleración según la
inclinación del dispositivo.• Cambios en los tres ejes: x, y, z• Movimientos: rotación e inclinación • Uno de los sensores más usados en iOS.• API muy sencilla de usar.
15
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Implementación (1)• Clase UIAccelerometer• API: http://developer.apple.com/library/ios/#DOCUMENTATION/
UIKit/Reference/UIAccelerometer_Class/Reference/UIAccelerometer.html
• Uso del singleton sharedAccelerometer• Definiremos el protocolo UIAccelerometerDelegate• Intervalo de tiempo determinado: (en segundos)
• Lo habitual: intervalo de cálculo cada 0.01 segundos.• A mayor frecuencia de cálculo -> menor rendimiento, mayor
precisión.
16
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / 60.0f)];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Implementación (2)• Implementación del protocolo UIAccelerometerDelegate
17
// Movemos una pelota por la pantalla
-(void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration { /* NSLog(@"x: %g", acceleration.x); NSLog(@"y: %g", acceleration.y); NSLog(@"z: %g", acceleration.z); */
_delta.x = acceleration.x * 10; _delta.y = acceleration.y * 10;
_pelota.center = CGPointMake(_pelota.center.x + _delta.x, _pelota.center.y + _delta.y);
}
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Ejemplos de uso (1)• Muy usado en juegos: • Ejemplo: volante para controlar un coche. Real Racing
18
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Ejemplos de uso (2)• Juego Labyrinth 2:• Vídeo: http://www.youtube.com/watch?v=_GEpwCqGZ54
19
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Giroscopio• Giroscopio• Implementación
20
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Giroscopio• Detecta la rotación del dispositivo sobre sí mismo.• Calcula la velocidad angular en los 3 ejes (x, y, z).• Permite saber “hacia donde” está orientado el dispositivo,
detecta los giros.• Complemento ideal para el acelerómetro:• Detección de movimiento en 6 ejes.• Acelerómetro: Detecta la aceleración en los 3 ejes.• Giroscopio: Detecta la orientación en los 3 ejes.
• Disponible a partir del iPhone 4, iPad 2.• Usado principalmente en juegos 3D.
21
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Implementación (1)• Framework: CoreMotion.framework• Clase: CMMotionManager• Iniciar el sensor del giroscopio:
• Timer para actualizar los valores del giroscopio:
22
[self.motionManager startGyroUpdates];
self.timer = [NSTimer scheduledTimerWithTimeInterval:1/30.0 target:self selector:@selector(actualizaGiroscopio) userInfo:nil repeats:YES];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Implementación (2)• Obtener los valores del giroscopio y realizar las acciones que
queramos:
23
-(void)actualizaGiroscopio { // Ratio de rotación en el eje z float rate = self.motionManager.gyroData.rotationRate.z; if (fabs(rate) > .2) { // comprobamos si es un valor significativo (>0.2) // Dirección de la rotación float direction = rate > 0 ? 1 : -1; // La rotación lo sumamos al valor actual _rotation += direction * M_PI/90.0; // Rotamos la imagen self.imagen.transform = CGAffineTransformMakeRotation(_rotation); }}
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Ejemplos de uso• Video demostración: http://www.youtube.com/watch?v=veN-
WHhtcjs
24
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Brújula• Brújula• Implementación
25
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Brújula• Permite obtener los grados respecto al norte
magnético y al norte verdadero (geográfico):• 0 = el dispositivo apunta al norte magnético.• 90 = el dispositivo apunta al este.• 180 = el dispositivo apunta al sur.• 270 = el dispositivo apunta al oeste.
• Disponible a partir del iPhone 3GS.
• Muy útil para aplicaciones que usen mapas y aplicaciones de realidad aumentada.
26
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Implementación (1)• Framework CoreLocation.framework
• Clase CLLocationManager:• Gestiona las actualizaciones de los valores de la brújula.
• Clase CLLocationDirection:• Obtiene los valores en grados de la brújula.
• Implementar el protocolo CLLocationManagerDelegate
• Iniciar las actualizaciones de la brújula:
27
[_locationManager startUpdatingLocation];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Implementación (2)• Implementar el método del protocolo CLLocationManager:
• Video demostración: http://www.youtube.com/watch?v=78eIB-s28_A
28
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { // Comprobación de la precisión del sensor if (newHeading.headingAccuracy < 0) return;
float gradosNorteMagnetico = newHeading.magneticHeading;float gradosNorteVerdadero = newHeading.trueHeading;
}
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
GPS• GPS• Implementación
29
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
GPS• Nos proporciona datos de posicionamiento:• Latitud• Longitud• Altitud• Velocidad
• Si el GPS no está disponible se accede por triangulación de antenas WiFi -> menor exactitud.
• Disponible a partir del iPhone 3GS.• Uso principalmente en aplicaciones de mapas, de realidad
aumentada y de navegación.
30
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Implementación (1)• Implementación muy similar a la brújula.• Framework: CoreLocation.framework• Clase CLLocationManager:• Gestiona las actualizaciones de los valores del GPS.
• Implementar el protocolo CLLocationManagerDelegate
• Iniciar las actualizaciones del GPS:
31
[_locationManager startUpdatingLocation];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Implementación (2)• Implementar los métodos del protocolo CLLocationManager:
32
// Métodos del protocolo CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog([newLocation descripcion]);
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { NSLog([error descripcion]);
}
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Implementación (3)
33
// Atributos de CLLocation:
// Velocidad [location speed]];
// Latitud location.coordinate.latitude;
// Longitudlocation.coordinate.longitude;
// Altitud [location altitude];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Proximidad y sensor de luz ambiente• Proximidad y sensor de luz ambiente• Implementación
34
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Proximidad y sensor de luz ambiente• Sensor de proximidad = sensor de luz ambiente.• Nos proporciona un valor booleano (sí/no) que indica si un
objeto está próximo al dispositivo.• No obtenemos un valor variable -> poca utilidad en
aplicaciones.• Usado en el iPhone para oscurecer la pantalla cuando usamos
el teléfono.• API liberada en el 2009 para su uso libre por los
desarrolladores.
35
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Ejemplo de uso• Uso en la aplicación de Google:• Activar automáticamente la búsqueda por voz al acercar el iPhone
al oído.
36
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Implementación (1)• Métodos del singleton UIDevice.
• Activar el sensor:
• Comprobar si el dispositivo soporta el sensor:
37
[device setProximityMonitoringEnabled:YES];
UIDevice *device = [UIDevice currentDevice];
BOOL sensorActivo = [device isProximityMonitoringEnabled];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
Implementación (2)• Crear notificación para obtener los cambios del sensor de
proximidad:• Notificación: UIDeviceProximityStateDidChangeNotification
38
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityChanged:) name:UIDeviceProximityStateDidChangeNotification object:device];
- (void) proximityChanged:(NSNotification *)notification { UIDevice *device = [notification object]; NSLog(@"Cambio en el valor de proximidad: %i", device.proximityState);}
Vídeo de funcionamiento:http://www.youtube.com/watch?v=lQ1M8GrVV_g
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Sensores © 2012-13 Depto. Ciencia de la Computación e IA Sensores en iOS
• ¿Preguntas?
39