Mostrando entradas con la etiqueta Xcode. Mostrar todas las entradas
Mostrando entradas con la etiqueta Xcode. Mostrar todas las entradas

sábado, 17 de septiembre de 2016

UIImagePickerViewController no funciona en iOS 10

El artículo de hoy es exclusivamente para programadores iOS y como veis es bastante corto, pero útil. 

Si tenéis alguna App que utilice UIImagePickerViewController y tenéis pensado publicar alguna actualización en breve, os daréis cuenta que el controlador de las funciones de cámara se quedará frito.

La solución a este problema es bastante sencillo. Bastará con añadir nuevos permisos a nuestro plist.

NSCameraUsageDescription
NSPhotoLibraryUsageDescription

en iOS 10 hay que dar permisos a las Apps para utilizar diferentes frameworks. La relación de permisos la podréis encontrar en el siguiente enlace de Apple

https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html


sábado, 26 de marzo de 2016

¿Qué es CocoaPods?

Aviso, este artículo es para desarrolladores o proyectos de desarrolladores. Si no estáis interesados en la programación iOS podéis continuar leyendo el artículo, pero no os garantizo que podáis entender algo.

CocoaPods nos proporciona inyección de dependencias para iOS (también para OSX). En este artículo no entraré en la batalla de a favor o en contra de la inyección de independencias en un proyecto, simplemente me limitaré a explicar cómo hacerlo a través de cocoapods.

Tampoco vamos a explicar el patrón de diseño de DI (Dependency Injection), para eso hay numerosos libros y artículos por la red.

Lo primero que tendremos que hacer es abrir el terminal y escribir

$ sudo gem install cocoapods

Después creamos un proyecto en Xcode o utilizamos uno ya existente. En esta captura podéis ver un proyecto existente llamado inup donde tendremos que crear un archivo llamado Podfile con cualquier editor de texto. La otra opción es desde el terminal, en la ruta donde se encuentren el archivo del proyecto *.xcodeproj escribir el siguiente comando:


$ pod init


Vamos a añadir las dependencias necesarias para poder utilizar Google Analytics. La otra opción sería descargar el SDK y copiar los archivos y adjuntar las librerías necesarias. Pero como hemos comentado antes, en este artículo nos vamos a limitar al uso de cocoapods.

Para ello el archivo deberá contener lo siguiente:

platform :ios, '8.0'

target 'inup' do
  pod 'Google/Analytics', '~> 1.0.0'
end

Como podéis observar tenemos que indicar, plataforma, versión desde la cual será funcional, el nombre de la App (nombre del proyecto, NO el Bundle name aunque en la mayoría de las ocasiones coincide).

Podríamos añadir más dependencias tras la de Analytics y más comandos al archivo de configuración, pero lo dejaremos para un artículo posterior.

Volvemos a abrir el terminal y nos dirigimos a la ruta donde se encuentra el archivo Podfile y escribimos

$ pod install

Tras la ejecución de este comando si todo ha ido bien, si volvemos a la ruta del proyecto, veremos cómo se han creado una carpeta de Pod, un archivo Podfile.lock y un *.xcworkspace.



Pues bien, ahora podremos/deberemos abrir nuestro proyecto desde el archivo *.xcworkspace (también me dejo para otro artículo qué es y cómo trabajar con el *xcworkspace).

Si importamos 

#import <Google/Analytics.h> 

veremos como no salta ningún error ni ningún aviso y podemos trabajar directamente con la librería de Analytics (también me dejo esta librería para próximos artículos), sin necesidad de haber importado nada a mano (ejemplo práctico de inyección de dependencias).

Si queremos añadir otra dependencia bastará con añadirla a nuestro Podfile y con el proyecto cerrado desde el terminal escribir:

$ pod update

Si queréis más información en español habrá que esperar al próximo artículo. Mientras tanto y en inglés os recomiendo echar un ojo a cocoapods 



sábado, 19 de septiembre de 2015

Primeras impresiones del nuevo Apple TV

Una de las grandes novedades de la pasada Keynote ofrecida por los de Cupertino fue sin lugar a dudas las presentación del nuevo Apple TV. Pues gracias al programa de desarrolladores de iOS & MacOS de la cual formo parte desde hace ya unos años, los amigos de Apple me han mandado un Apple TV para comenzar a desarrollar Apps.


Las características técnicas del nuevo Apple TV son las siguientes:
  • Procesador A8 de 64-bit
  • 32GB o 64GB de disco duro
  • 2 GB de RAM
  • 10/100 Mbps Ethernet
  • WiFi 802.11/a/b/g/n/ac
  • Resolución 1080p
  • HDMI
  • Nuevo mando a distancia con Siri.



Sin duda alguna, nada más sacar todos los componentes de la caja lo que más llama la atención es el mando del AppleTv cuyas características técnicas son:

  • Superficie táctil al más puro estilo iPhone.
  • Diferentes botones de control.
  • Botón de invocación a Siri.
  • Ranura para carga.
  • Un diseño exquisito.

En próximos artículos os iré comentando las primeras sensaciones sobre el desarrollo en TvOS.



    viernes, 28 de agosto de 2015

    Crear un formulario en iOS nivel PRO con UITextField. Parte III.

    Continuamos a partir del anterior artículo, el cual podréis ver pulsando aquí. Lo primero que vamos a hacer es crear un botón. Este botón posteriormente será de Login, pero como todavía no podemos hacer login a ningún sitio, lo utilizaremos para hacer comprobaciones en los UITextField.

    loginButton = [[UIButton alloc] initWithFrame:CGRectMake(0., 0., 100., 30.)];
        [loginButton setCenter:CGPointMake(self.view.center.x, passWordTextField.center.y + passWordTextField.frame.size.height + loginButton.frame.size.height)];
        [loginButton setTitle:NSLocalizedString(@"Check", nil) forState:UIControlStateNormal];
        [loginButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
        [loginButton addTarget:self action:@selector(checkAction) forControlEvents:UIControlEventTouchUpInside];
        

        [self.view addSubview:loginButton];

    Posteriormente declaramos el método checkAction y el método checkFields que devolverá un booleano analizando los diferentes UITextField creados.

    - (void)checkAction
    {
        if([self checkFields])
            NSLog(@"Todo OK");
    }

    - (BOOL)checkFields
    {
        if(nameTextField.text.length == 0)
        {
            [self presentAlertViewWithMessage:NSLocalizedString(@"El campo nombre no puede estar vacío.", nil)];
            return false;
        }
        if(nameTextField.text.length > 20)
        {
            [self presentAlertViewWithMessage:NSLocalizedString(@"El campo nombre no puede superar los 20 caracteres.", nil)];
            return false;
        }
        if(passWordTextField.text.length == 0)
        {
            [self presentAlertViewWithMessage:NSLocalizedString(@"El campo password no puede estar vacío.", nil)];
            return false;
        }
        if(passWordTextField.text.length > 6)
        {
            [self presentAlertViewWithMessage:NSLocalizedString(@"El campo password no puede superar los 6 caracteres.", nil)];
            return false;
        }
        if(mailTextField.text.length == 0)
        {
            [self presentAlertViewWithMessage:NSLocalizedString(@"El campo email no puede estar vacío.", nil)];
            return false;
        }
        if(mailTextField.text.length > 50)
        {
            [self presentAlertViewWithMessage:NSLocalizedString(@"El campo email no puede superar los 50 caracteres.", nil)];
            return false;
        }
        
        return true;

    }

    Si compilamos y ejecutamos la App podemos comprobar como nos muestra las alertas si no cumplimos alguna de las condiciones. Pero, si yo quiero prohibir al usuario, que por ejemplo no añada más de 20 caracteres en su UITextField haremos los siguiente.


    Tendremos que modificar el siguiente método del delegado de UITextField

    //Método que se llama cuando se introducae algún valor por teclado
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        NSUInteger newLength;
        
        newLength = [textField.text length] + [string length] - range.length;
        
        if([textField isEqual:nameTextField])
            return (newLength > 20) ? NO : YES;
        if([textField isEqual:mailTextField])
            return (newLength > 50) ? NO : YES;
        if([textField isEqual:passWordTextField])
            return (newLength > 6) ? NO : YES;

        return YES;
    }

    Si ahora compilamos y ejecutamos la App. Podemos comprobar como si intentamos introducir más caracteres de los indicados en el método, el UITextField no nos permite añadirlos.


    Os dejo el código en el siguiente path de GitHub





      

    viernes, 26 de junio de 2015

    Crear un formulario en iOS nivel PRO con UITextField. Parte II.

    Continuamos a partir del anterior artículo, el cual podréis ver pulsando aquí. Lo primero que haremos será crear dos nuevos UITextFields para introducir una contraseña y un email.

    @property (nonatomic, strong) UITextField *passWordTextField;
    @property (nonatomic, strong) UITextField *mailTextField;

    Les añadiremos nuevas características como la introducción de datos en modo oculto para la contraseña y un botón de borrado.

        [mailTextField setDelegate:self];
        [mailTextField setPlaceholder:@"Email"];
        [mailTextField setKeyboardType:UIKeyboardTypeEmailAddress];
        [mailTextField setReturnKeyType:UIReturnKeyDone];
        [mailTextField setBorderStyle:UITextBorderStyleLine];
        [mailTextField setClearButtonMode:UITextFieldViewModeAlways];
        
        [self.view addSubview:mailTextField];
        
        [passWordTextField setDelegate:self];
        [passWordTextField setPlaceholder:@"Contraseña"];
        [passWordTextField setKeyboardType:UIKeyboardTypeEmailAddress];
        [passWordTextField setReturnKeyType:UIReturnKeyDone];
        [passWordTextField setBorderStyle:UITextBorderStyleBezel];
        [passWordTextField setSecureTextEntry:YES];
        [passWordTextField setClearButtonMode:UITextFieldViewModeWhileEditing];
        

        [self.view addSubview:passWordTextField];




    A continuación editaremos algunos elementos gráficos del UITexField. Por defecto tiene cuatro tipos de borde, aunque en próximos artículos explicaré como aumentar estas posibilidades a infinito. También le indicaremos el botón de retorno y el tipo de aspecto que queremos que tenga el teclado.
    Tras ejecutar el código y comprobar los métodos del delegado del UITextField la primera duda que nos surgirá será cómo diferenciar los diferentes UITextField.


    - (BOOL)textFieldShouldClear:(UITextField *)textField
    {
        if([textField isEqual:mailTextField])
            [mailTextField setText:@""];
            
        else if(textField == passWordTextField)
            passWordTextField.text = @"";
        return NO;

    }



    Las dos fórmulas utilizadas en el código anterior son correctas. Si lo que queremos es que al pulsar el botón de borrado siempre se borre el texto del UITextField seleccionado bastará con devolver un TRUE.

    Como ya comenté en el anterior artículo, iré subiendo el código al siguiente enlace de GitHub
    https://github.com/ManuelManzanera/FormularioViewController

    miércoles, 24 de junio de 2015

    Crear un formulario en iOS nivel PRO con UITextField. Parte I.

    En este artículo voy a explicar como crear un formulario para introducir diferentes tipos de datos. El componente principal de cualquier formulario de entrada de datos en iOS será el UITextField. Y que mejor manera de explicarlo que a través de un ejemplo que subiré a GitHub. Lo primero que haremos será crear el UITextField, inicializarlo e indicarle a nuestro view controller que será el delegado del UITextField.

    nameTextField = [[UITextField alloc] initWithFrame:CGRectMake(10.,30., 300., 30.)];
    [nameTextField setDelegate:self];

    A continuación editaremos algunos elementos gráficos del UITexField. Por defecto tiene cuatro tipos de borde, aunque en próximos artículos explicaré como aumentar estas posibilidades a infinito. También le indicaremos el botón de retorno y el tipo de aspecto que queremos que tenga el teclado.

    [nameTextField setBorderStyle:UITextBorderStyleNone];
    [nameTextField setReturnKeyType:UIReturnKeyDone];
    [nameTextField setKeyboardAppearance:UIKeyboardAppearanceDark];


     



    También le indicamos un valor por defecto para indicar qué queremos que se introduzca en el UITextField. Este valor no indica que el UITextField tenga texto por defecto. De hecho, si hiciéramos un log con el valor de texto o el tamaño de la cadena del texto, no nos devolvería nada o nos devolvería cero.

    [nameTextField setPlaceholder:@"Nombre de usuario"];

    Para poder analizarlos métodos del delegado e ir siguiendo las mejoras del código lo iré subiendo todo al siguiente repositorio de GitHub

    https://github.com/ManuelManzanera/FormularioViewController

    miércoles, 10 de junio de 2015

    ¿Cómo hacer una captura de pantalla de nuestro dispositivo iOS con Xcode?

    Lo primero que os preguntaréis algunos es para qué puedo necesitar hacer una captura de la pantalla de mi dispositivo iOS con Xcode desde el MAC. Si pensáis en desarrollar una App, una de las condiciones indispensables para subirla al AppStore, es ofrecer imágenes de la App. Es cierto que si contáis con buenos diseñadores probablemente ellos os las prepararán desde su mockup. Pero si este no es el caso, una buena opción es mostrar las capturas de pantalla de la App. También sirve de gran utilidad para mostrarle a un cliente cómo queda algún recurso, etc. Las podréis utilizar para crear documentación o para cualquier cosa que se os ocurra.

    - Lo primero que debéis hacer es abrir Xcode con un dispositivo iOS conectado y pulsad sobre Windows>Devices. Os deberá aparecer una ventana como la que muestro a continuación.



    - Posteriormente solo tendréis que pulsar sobre el botón "Take screenshot" para que os aparezca la captura de la pantalla del dispositivo en vuestro escritorio.