iOS : Ejercicio 14. Acceso a la cámara y galería de fotos del iPhone

Blog >Lista ejercicios >  Ejercicio 14


Buenas desarrolladores, en este post vamos a ver como usar la cámara del dispositivo y cómo acceder a la librería.




Ejercicio 14 : Cámara y libreria iphone

Abrimos proyecto de la forma habitual
 

Bien, vamos ahora al storyboard, ahí arrastramos un UIImageView, un ToolBar y un Bar Button Item, para gestionar lo que queremos hacer. Para cambiar el iconito del botón Bar Button Item, vamos al inspector de objetos a la cuarta pestañita, y en identifier : Camera. 






Arrastramos una conexión al archivo .h de ese botón y otra de la imagen.Para poder crear un pequeño menu con las opciones, hacemos que herede de UIActionSheetDelegate

@interface ViewController : UIViewController 
//Conexión imagen 
@property (weak, nonatomic) IBOutlet UIImageView *imagen;
//Conexión PulsarBoton
- (IBAction)PulsarBotonCamara:(id)sender;
@end


Ahora en el .m, ha aparecido la función por la que siempre pasa al hacer el click, aplicamos un pequeño menú con opciones para que aparezca cada vez que se pulse el botón :

- (IBAction)PulsarBotonCamara:(id)sender {
    //Creamos menú para acceder a la cámara o a la galería
    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"Selecciona acción" delegate:self cancelButtonTitle:@"Cancelar" destructiveButtonTitle:nil otherButtonTitles:@"Librería", @"Cámara", nil];
    [sheet showInView:self.view];
}


Ejecutamos el proyecto, para ver si aparece el minimenú :




Bien, ahora implementamos esta función : clickedButtonAtIndex , para saber que boton se ha pulsado del sheet, además de añadir 2 funciones.Cada una de las funciones iniciará la cámara y la otra la librería.


//PARA SABER EL BOTON QUE SE HA PULSADO EN EL SHEET

-(void)iniciarLibreria{
}
-(void)iniciarCamara{

}
-(void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
       if(buttonIndex==0){
           [self iniciarCamara];
        }else if (buttonIndex==1){
           [self iniciarCamara];
    }
}


Bien, ahora para iniciar la camara o la galería vamos a tocar el .h para que herede de estas clases más, y así podremos acceder mediante varias funciones a varios eventos que ocurren a la hora de sacar la foto o al cancelar.

 @interface ViewController : UIViewController 
 
@property (weak, nonatomic) IBOutlet UIImageView *imagen;
- (IBAction)PulsarBotonCamara:(id)sender;

@end


Estas son las dos funciones anteriores, cada una para abrir la cámara o la librería.

-(void)iniciarLibreria{
    UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];
    [pickerController setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    [self presentModalViewController:pickerController animated:YES];
}

-(void)iniciarCamara{
    //Objeto para acceder a la camara, en este calo la galería de fotos que sale por defecto
    UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];
    //Identifica si esta disponible la cámara
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        //Seleccione tipo de cámara
        [pickerController setSourceType:UIImagePickerControllerSourceTypeCamera];
    }else{
        NSLog(@"No hay cámara disponible");
    }
    //HACEMOS QUE SEA DELEGADO
    [pickerController setDelegate:self];
    [self presentModalViewController:pickerController animated:YES];
}
Si todo está bien echo, el dispositivo podrá acceder a cámara y la galería, para complementarlo ponemos también unas funciones :
//FUNCION QUE SE EJECUTA CUANDO SELECCIONAMOS QUE QUEREMOS USAR LA FOTO
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    //Cogemos la foto
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    //La asignamos al ImageView del ViewController
    [self.imagen setImage:image];
    [self dismissModalViewControllerAnimated:YES];
}
//FUNCION QUE SE EJECUTA AL PULSAR CANCELAR EN CUANTO SE ACCEDE A LA CAMARA
- (void) imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    NSLog(@"Se ha cancelado el picker.");
    //para que vuelva a la vista anterior
    [self dismissModalViewControllerAnimated:YES];
}
@end
Pues ya está facilito para que cada uno investigue ya más en profundidad depende de lo que le interese. Salu2!!



Compartir Compartir Compartir Compartir




Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio

iOS : Ejercicio 13. Acelerómetro y CMMotionManager

Blog >Lista ejercicios >  Ejercicio 13


Hola developers, continuamos nuestro tutorial de ejercicios básicos con este post :




Ejercicio 13. Usando el acelerómetro con CMMotionManager

Antes de nada, vamos a comentar un poco lo que es el acelerómetro :

El acelerómetro es la medida de aceleración de los 3 ejes (x, y, z) del dispositivo. 



El acelerómetro es un sensor que mide la aceleración. Cuando el dispositivo está quieto recibe una aceleración que se mide en gravedad : (1g = 9´8 N). 

Gracias al acelerómetro sabemos si el dispositivo está hacia arriba, boca abajo, su inclinación, etc... El sensor sólo mide los movimientos, no mide la distancia con el suelo. Si el dispositivo está en reposo recibirá 1g en el eje Z, si está en caida libre recibirá 0g.


Podemos usar el acelerómetro de 2 maneras, la primera mediante un delegado que se encargará de ejecutar algún método en función el cambio de los valores de dicho acelerómetro. La segunda en el intervalo de actualización que está en segundos. Se suelen tomar valores pequeños : (1/100) segundos.

En este ejercicio, vamos a usar la segunda, es decir usar el framework Core Motion, que permite a las aplicaciones recibir datos que los sensores de movimiento recogen constantemente. Vamos a usar CMMotionManager para interactuar con el framework.

Se crea una UNICA instancia de la clase para trabajar con sensores.


CMMotionManager *motionManager =[[CMMotionManager alloc] init];


Bueno, vamos al lio, abrimos proyecto en XCode de la forma habitual :




Vamos a darle al proyecto,vamos a la pestaña Build Phases, en el apartado Link Binary With Libraries y en el + importamos Core Motion, a continuación en el storyboard ponemos 6 labels o con 3 nos vale, abrimos la vista "Asistant Editor" y colocamos las conexiones pertinentes a las labels. En esta imagen esta ya todo hecho, a la izquierda si os fijais en la carpeta frameworks aparece.




#import 
#import 

@interface ViewController : UIViewController{
    __weak IBOutlet UILabel *valorX;
    __weak IBOutlet UILabel *valorY;
    __weak IBOutlet UILabel *valorZ;
}
@end


Como veis el .h tiene poco, las 3 conexiones y el import de la libreria Core Motion, mientras que en el .m ya hacemos más operaciones, como verificar que el software necesario del teléfono está disponible, o el intervalo de refrescar los datos.

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
 //Instancia a objeto
    CMMotionManager *motionManager = [[CMMotionManager alloc] init];
    //ASIGNAMOS EL INTERVALO DE ACTUALIZACION
    motionManager.gyroUpdateInterval = 1.0 / 30.0;
    //PREGUNTAMOS SI EL DISPOSITIVO TIENE EL SOFTWARE NECESARIO
    if (motionManager.gyroAvailable) {
        //En el interior del manejador indicaremos las opciones a realizar cuando el giroscopio este activo
        [motionManager startGyroUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMGyroData *gyroData, NSError *error) {
            //almacenamos variables del acelerómetro
   double gyroX = gyroData.rotationRate.x;
            double gyroY = gyroData.rotationRate.y;
            double gyroZ = gyroData.rotationRate.z;

            valorX.text = [NSString stringWithFormat:@"%f", gyroX];
            valorY.text = [NSString stringWithFormat:@"%f", gyroY];
            valorZ.text = [NSString stringWithFormat:@"%f", gyroZ];
        }];
        [motionManager stopGyroUpdates];
    }
}
@end


Y ya está, esta es la base para comenzar a usar el acelerómetro, sólo funciona con dispositivos reales.

Ya que el emulador carece del software necesario. No digo más ya que el código está comentado. Salu2!!!!!




Compartir Compartir Compartir Compartir




Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio

Boxing Clock Contador de asaltos de boxeo

Buenas developers, centrandome ya en la publicidad de mi aplicación, os presento un cartel publicitario sobre la aplicación.

Boxing Clock


  


Podeis descargarosla desde Google Play en el siguiente enlace :

https://play.google.com/store/apps/details?id=cronometroboxeo.com






iOS : Ejercicio 12. Crear un MapView en XCode

Blog >Lista ejercicios >  Ejercicio 12


Hola developers vamos a hacer un MKMapView



EJERCICIO 12: MKMapView en XCode

Comenzamos el ejercicio 12 creando un nuevo proyecto de la forma habitual : file - new proyect - View based application o single view application, depende de la versión.

Nos tocará importar a nuestra libreria un par de frameworks, esto se hace clickando en el proyecto - Build Phases - Link Binary With Libraries.

Le damos al +, y buscamos los que nos interesen.

El primero es MapKit.framework para el mapa.
El segundo es CoreLocation.framework para las localizaciones.








Ya está, arrastramos un MKMapView a nuestro storyboard, nuestros frameworks ya han aparecido en la carpeta Frameworks, ejecutamos el proyecto y... este es el resultado :







Ahora bien, si queremos acercarnos, doble click, para alejarnos, pulsamos alt y aparecen dos bolitas, dependiendo de cómo de alejadas estén, se verá mas lejos, cuanto más cerca estén, mas cerca se verá.


Configuramos la conexion para el view Controller.h

//  ViewController.h
//  Mapkit
// 

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet MKMapView *mapa;

@end


Vamos ahora a cambiar el mapa de nuestra aplicación,por defecto aparecen los EEUU, pero queremos que aparezca nuestra bendita España, una bella tierra, aunque se la estén cargando estos malditos politicos corruptos... en fin. Yo he cogido de Google Maps las coordenadas de Madrid :


@implementation ViewController

@synthesize mapa;

- (void)viewDidLoad
{
    [super viewDidLoad];
    //Configuramos la region que queremos delimitar de nuestro mapa
    MKCoordinateRegion region;
    //La altura a la que vamos a mostrar nuestro mapa
    MKCoordinateSpan altura;
    altura.latitudeDelta = 4;
    altura.longitudeDelta = 4;
    
    region.span=altura;
    
    //LOCALIZACION
    CLLocationCoordinate2D localizacion;
    localizacion.latitude= 40.4378271;
    localizacion.longitude=-3.679566;
    
    region.center=localizacion;
    //ASIGNAMOS LA REGION AL MAPA
    [mapa setRegion:region animated:YES];
}


Vualá!! ya tenemos nuestro MKMapView!!




Este mapa se puede poner en modo normal, por satélite o híbrido así que añadimos un elemento llamado Toolbar a nuestro mapa para poder cambiarlo.A ese elemento Tool Bar, le añadimos dos Bar Button Item, uno llamado mapa y otro Híbrido. Si además añadimos un Flexible Space Bar Button Item entre ellos y pegando a los bordes, nos separará los botones de una manera proporcional, para que queden situados perfectamente.




Ahora para darle funcionalidad a los botones vamos al .m a implementar la lógica de los botones, aunque primero asignamos un Tag a cada botón (1,2 y 3 respectivamente). Vamos a hacer una funcion que haga de IBACTION, en el .h


//CREAMOS UN IBAction, que es la función que hace de botón
-(IBAction) BotonTipMap:(id) sender;


Y en vez de hacer las conexiones como IBOutlet de los items del ToolBar arrastramos pulsando control dentro de la función, para asignarle los elementos.




Vamos a desarrollar la función en el .m para que según se pulse un botón, se ponga el mapa solo, satélite o un híbrido :

-(IBAction) BotonTipMap:(id) sender{
    //Creamos el botron que referencia el id
    UIBarButtonItem *item=(UIBarButtonItem *)sender;
    if (item.tag==1) {
        [mapa setMapType:MKMapTypeSatellite];
    }else if (item.tag==2){
        [mapa setMapType:MKMapTypeStandard];
    }else if (item.tag==3){
        [mapa setMapType:MKMapTypeHybrid];
    }
}


Y para finalizar, vamos a ponerle un punto sobre el mapa de localizacion, se pueden crear tantos como queramos, siempre añadiendo objetos nuevos, este código va en la función ViewDidLoad :

    //PUNTO DE LOCALIZACION
    //Creamos coordenada con latitud y longitud
    CLLocationCoordinate2D PuntoCoordenada = CLLocationCoordinate2DMake(region.center.latitude, region.center.longitude);
    //Creamos el pivote
    MKPointAnnotation *pivote = [[MKPointAnnotation alloc] init];
    //Le asignamos la coordenada
    [pivote setCoordinate:PuntoCoordenada];
    //Le ponemos titulo y subtitulo
    [pivote setTitle:@"MadrizZzZzZ"];
    [pivote setSubtitle:@"Capital de España"];
    //Lo introducimos en el mapa
    [self.mapa addAnnotation:pivote];


Y aquí tenemos nuestro mapa maqueadito chulo :




De maqueadito a maqueado hay una gran diferencia, para ello vamos a indagar en la clase delegada de la aplicación, vamos a usar nuestro ViewController como clase delegada, para que podamos usar los métodos delegados del MapView, es decir los métodos que se ejecutan cuando se ejecuta un MapView, cuando se mueve, cuando sucede algun evento.... en el ViewController.m, en el método viewDidLoad ponemos :


mapa.delegate=self;


pero nos saldrá error, eso es porque en el .h tenemos que hacer que herede de MKMapViewDelegate

@interface ViewController : UIViewController 

@property (weak, nonatomic) IBOutlet MKMapView *mapa;

@end


Ya podemos customizar un poquito nuestro mapa, vamos a usar una clase para ello, en el viewController.m dentro de la función he puesto para que se anime el pivote.

//MÉTODO PARA CUSTOMIZAR EL CUADRO DEL PIVOTE
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation{
 //OBJETO
 MKPinAnnotation *pinView = [[MKPinAnnotationView alloc] intiWithAnnotation:annotation reuseIdentifier:@"curr"];
 //PROPIEDAD PARA ANIMAR EL PIVOTE, EN ESTE CASO QUE SE DEJE CAER
 pinView.animatesDrop=YES
 //PROPIEDAD PARA PONER OTRO COLOR AL PIVOTE
 pinView.pinColor = MKPinAnnotationColorPurple;
 
 return pinView;
}


Hemos cambiado unas cuantas propiedades, pero si ejecutamos el proyecto al pulsar sobre el pivote a diferencia de antes, no aparece nada, eso es porque le hemos dicho que use la vista pinView, entonces hay que decirle que cargue lo que anteriormente teníamos.Añadimos también una imágen, primero hay que añadirla al proyecto :


//MÉTODO PARA CUSTOMIZAR EL CUADRO DEL PIVOTE
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation{
 //OBJETO
 MKPinAnnotation *pinView = [[MKPinAnnotationView alloc] intiWithAnnotation:annotation reuseIdentifier:@"curr"];
 //PROPIEDAD PARA ANIMAR EL PIVOTE, EN ESTE CASO QUE SE DEJE CAER
 pinView.animatesDrop=YES
 //PROPIEDAD PARA PONER OTRO COLOR AL PIVOTE
 pinView.pinColor = MKPinAnnotationColorPurple;
 //PARA QUE CARGUE LA ANTERIOR
 pinView.canShowCallout = YES;
 //AÑADIR IMAGEN
 UIImageView *imagen [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"madrid.jpg"]];
 //CONFIGURAMOS LAS DIMENSIONES FRAME IMAGEN
 [imagen setFrame:CGRectMake(0,0,50,50)];
 //INSERTAMOS IMAGEN
 pinView.leftCalloutAccessoryView = imagen;
 
 return pinView;
}





Por último vamos a insertar un botón de forma dinámica en el bocadillo que nos aparece con el título, subtítulo e imágen, cuando le pulsemos saldrá de la aplicación, ¿ Cómo lo hacemos ? Creamos otro método que cuando se ejecute haga la acción en el .m (hacer el mismo proceso en el .h que con el anterior método IBAction)


-(IBAction)BotonDinamico:(id)sender{
 exit();
}

//MÉTODO PARA CUSTOMIZAR EL CUADRO DEL PIVOTE
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation{
 //OBJETO
 MKPinAnnotation *pinView = [[MKPinAnnotationView alloc] intiWithAnnotation:annotation reuseIdentifier:@"curr"];
 //PROPIEDAD PARA ANIMAR EL PIVOTE, EN ESTE CASO QUE SE DEJE CAER
 pinView.animatesDrop=YES
 //PROPIEDAD PARA PONER OTRO COLOR AL PIVOTE
 pinView.pinColor = MKPinAnnotationColorPurple;
 //PARA QUE CARGUE LA ANTERIOR
 pinView.canShowCallout = YES;
 //AÑADIR IMAGEN
 UIImageView *imagen [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"madrid.jpg"]];
 //CONFIGURAMOS LAS DIMENSIONES FRAME IMAGEN
 [imagen setFrame:CGRectMake(0,0,50,50)];
 //INSERTAMOS IMAGEN
 pinView.leftCalloutAccessoryView = imagen;
 
 //CREAMOS BOTON DE FORMA DINAMICA
 UIButton *boton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
 [boton addTarget:self action:@selector(BotonDinamico:) forControlEvents:UIControlEventTouchUpInside];
 //INSERTAMOS BOTON A LA IZQUIERDA
 pinView.leftCalloutAccessoryView = boton;
 
 return pinView;
}


Y este es el resultado :







Compartir Compartir Compartir Compartir




Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio

iOS : Ejercicio 11.Usar CLLocation para hayar nuestra localización

Blog >Lista ejercicios >  Ejercicio 11


Hola developers, seguimos con el tutorial de ejercicios



iOS : Ejercicio 11 : Cómo averiguar una localización.

Vamos a crear un nuevo proyecto de la forma habitual file - new - proyect - Single View Aplicattion. Ahora clickamos en el proyecto y vamos a importar el framework de la localización, esto se hace en la pestaña Build Phases Link Binary With Libraries, damos al botón + y buscamos el framework Core Location para importarlo al proyecto :





Perfecto, vamos al storyboard y ponemos en la View Controller así con sus pertinentes conexiones, el botón, vamos a ponerle IBOutlet para cambiar su apariencia y para el evento onclick mediante action,tambien creamos una variable "Inicializada" para verificar que se ha hay el software específico en el teléfono, es decir que se carga el método viewDidLoad, y otra "Empezada "para partir del supuesto de que no ha sido empezada el cálculo de coordenadas. Además importamos el framework CoreLocation y le vamos a hacer que sea delegado :





Hemos creado un objeto CLlocationManager, que permite indicar la frecuencia y la precisión usadas para obtener información del dispositivo a cerca de su ubicación.

#import 
#import 

@interface ViewController : UIViewController
{
    
    __weak IBOutlet UILabel *valorLatitud;
    __weak IBOutlet UILabel *valorLongitud;
    __weak IBOutlet UIButton *aparienciaBoton;
}
- (IBAction)accionBoton:(id)sender;

@property BOOL Inicializada;
@property BOOL Empezada;
//OBJETO PARA GUARDAR LA LOCALIZACION
@property (strong, nonatomic) CLLocationManager *Localizacion;

@end



@implementation ViewController

@synthesize Localizacion;
@synthesize Inicializada;
@synthesize Empezada;


- (void)viewDidLoad
{
    [super viewDidLoad];
    Inicializada =YES;
    
    [aparienciaBoton setTitle:@"Calcular" forState:UIControlStateNormal];
   //PARTIMOS DE LA BASE DE QUE NO ESTA INICIALIZADA
    Empezada=NO;
    
    Localizacion = [[CLLocationManager alloc]init];
    //INDICAMOS QUE EL DELEGADO SE ENCUENTRA EN LA CLASE
    Localizacion.delegate=self;
    //CREAMOS EL MENSAJE DE VERIFICACION DEL USUARIO PARA QUE ACEPTE
    Localizacion.purpose = @"Aplicación que muestra la posición";
    
    
 // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
//FUNCION PARA ERRORES
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    
    if (error.code==kCLErrorDenied) {
        Inicializada=NO;
        [Localizacion stopUpdatingLocation];
    }
}

//ACCION DEL BOTON
- (IBAction)accionBoton:(id)sender {
    //SINO ESTA INICIALIZADA NO HACEMOS NADA
    if (Inicializada == NO) {
        return;
    }else{
        if (Empezada ==NO) {
            [aparienciaBoton setTitle:@"Detener Cálculo" forState:UIControlStateNormal];
            //ACTUALIZAMOS LOCALIZACION
            [Localizacion startUpdatingLocation];
            Empezada=YES;
            return;
        }else{
            [aparienciaBoton setTitle:@"Comenzar Cálculo" forState:UIControlStateNormal];
            [Localizacion stopUpdatingLocation];
            Empezada=NO;
            return;
        }
    }
    
}
@end



Ahora vamos a usar la función didUpdateLocations, si no hubiéramos declarado como delegada la misma clase no podríamos usar esta función, es la que se usa cada vez que se actualiza el objeto CLLocationManager, ahí es donde tenemos que tratar los labels del storyboard para que muestre las coordenadas correctamente :

//METODO PARA ACTUALIZAR LOS LABEL DE LA LATITUD Y LONGITUD
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    //Cogemos el primer elemento del array que es donde estan los datos en el
    //objeto Localizacion
    CLLocation *loc = [locations objectAtIndex:[locations count]-1];
    //Cogemos latitud y longitud
    float latitud=loc.coordinate.latitude;
    float longitud=loc.coordinate.longitude;
    
    valorLatitud.text = [NSString stringWithFormat:@"%2.3f",latitud];
    valorLongitud.text = [NSString stringWithFormat:@"%2.3f",longitud];
    
    
}


Ejecutamos la alicación...










Compartir Compartir Compartir Compartir




Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio