sensores - ua · 2012. 4. 26. · • framework: coremotion.framework • clase: cmmotionmanager...

39
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles © 2011-2012 Depto. Ciencia de la Computación e IA Sensores Sesión 3: Sensores en iOS jueves 22 de marzo de 12

Upload: others

Post on 27-Jan-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    © 2011-2012 Depto. Ciencia de la Computación e IA

    Sensores

    Sesión 3: Sensores en iOS

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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)

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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");}

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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; }

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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); }

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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 } }

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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]; }

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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... }

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 Depto. Ciencia de la Computación e IA Sensores en iOS

    Acelerómetro• Acelerómetro• Implementación

    14

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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)];

    jueves 22 de marzo de 12

    http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIAccelerometer_Class/Reference/UIAccelerometer.htmlhttp://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIAccelerometer_Class/Reference/UIAccelerometer.htmlhttp://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIAccelerometer_Class/Reference/UIAccelerometer.htmlhttp://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIAccelerometer_Class/Reference/UIAccelerometer.htmlhttp://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIAccelerometer_Class/Reference/UIAccelerometer.htmlhttp://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIAccelerometer_Class/Reference/UIAccelerometer.html

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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);

    }

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

    http://www.youtube.com/watch?v=_GEpwCqGZ54http://www.youtube.com/watch?v=_GEpwCqGZ54

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 Depto. Ciencia de la Computación e IA Sensores en iOS

    Giroscopio• Giroscopio• Implementación

    20

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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];

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 Depto. Ciencia de la Computación e IA Sensores en iOS

    Implementación (2)• Obtener los valores del giroscopio y realizamos 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); }}

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

    http://www.youtube.com/watch?v=veN-WHhtcjshttp://www.youtube.com/watch?v=veN-WHhtcjshttp://www.youtube.com/watch?v=veN-WHhtcjshttp://www.youtube.com/watch?v=veN-WHhtcjs

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 Depto. Ciencia de la Computación e IA Sensores en iOS

    Brújula• Brújula• Implementación

    25

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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];

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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;

    }

    jueves 22 de marzo de 12

    http://www.youtube.com/watch?v=78eIB-s28_Ahttp://www.youtube.com/watch?v=78eIB-s28_Ahttp://www.youtube.com/watch?v=78eIB-s28_Ahttp://www.youtube.com/watch?v=78eIB-s28_A

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 Depto. Ciencia de la Computación e IA Sensores en iOS

    GPS• GPS• Implementación

    29

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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];

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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]);

    }

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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];

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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 usemos

    el teléfono.• API liberada en el 2009 para su uso libre por los

    desarrolladores.

    35

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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];

    jueves 22 de marzo de 12

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 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

    jueves 22 de marzo de 12

    http://www.youtube.com/watch?v=lQ1M8GrVV_ghttp://www.youtube.com/watch?v=lQ1M8GrVV_ghttp://www.youtube.com/watch?v=lQ1M8GrVV_ghttp://www.youtube.com/watch?v=lQ1M8GrVV_g

  • Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

    Sensores © 2011-2012 Depto. Ciencia de la Computación e IA Sensores en iOS

    • ¿Preguntas?

    39

    jueves 22 de marzo de 12