Upload
jcortmx
View
35
Download
7
Embed Size (px)
DESCRIPTION
Manual de Curso avanzado de IOS V1.2
Citation preview
Contenido del curso
Manual IOS
Avanzado Curso de desarrollo de
aplicaciones en plataforma
IOS
1
Tabla de contenido Manejo de directorios............................................................................................................ 4
Cambiar Directorios ........................................................................................................... 5
Crear Leer y Borrar Directorios............................................................................................ 5
Listar contenido de un directorio ........................................................................................ 6
Obtener atributos de un archivo o directorio ....................................................................... 7
Manejo de archivos ............................................................................................................... 7
Verificar si existe un archivo ............................................................................................... 8
Comparacin de dos archivos ............................................................................................. 8
Verificando los permisos del archivo ................................................................................... 9
Mover o renombrar un archivo ........................................................................................... 9
Copiar un archivo ............................................................................................................. 10
Borrar un archivo ............................................................................................................. 10
Crear un link simblico ..................................................................................................... 10
Leer y escribir archivos con NSFileManager ....................................................................... 11
Crear un objeto NSFileHandle ........................................................................................... 12
Proceso de desplazamiento (Offsets) y bsqueda (Seeking) ................................................ 12
Leer datos en un archivo .................................................................................................. 13
Escribir los datos en el archivo .......................................................................................... 14
Base de Datos...................................................................................................................... 16
Qu es SQLite? ............................................................................................................... 16
Historia........................................................................................................................... 16
Caractersticas............................................................................................................... 16
Plataformas de SQLite .................................................................................................. 17
Aplicaciones de SQLite ................................................................................................. 17
Estructurar BD ................................................................................................................. 18
Abrir o Crear una BD......................................................................................................... 18
Crear Tabla de BD............................................................................................................. 19
Prepara y Ejecutar sentencias SQL..................................................................................... 19
Integrar SQL Lite en proyecto............................................................................................ 21
Extraer informacin de una BD. ........................................................................................ 23
Multitouch, Tap, y Gestos .................................................................................................... 35
2
Gestos, Taps y Touches..................................................................................................... 35
Crear una aplicacin con Gestos........................................................................................ 37
Detectar Gestos dentro de la pantalla ............................................................................... 45
Integracin de Mapas .............................................................................................................. 73
Adicionar Mapa ................................................................................................................... 73
Ubicar posicin.................................................................................................................... 78
Calcular distancias ............................................................................................................... 82
Cmara ............................................................................................................................... 83
Crear Aplicacin con cmara. ............................................................................................ 83
Manejo de imgenes. ....................................................................................................... 91
Carga de una Imagen desde Internet ................................................................................. 95
Carga de una imagen desde la Galera de fotos .................................................................. 96
Ejercicio subir imgenes a servicio..................................................................................... 97
Redes Sociales........................................................................................................................102
Uso de SL Request. ..........................................................................................................102
Integrar Twitter...............................................................................................................106
Integrar Facebook. ..........................................................................................................108
Disear interface de usuario. ...........................................................................................111
Realizar "testing" a la aplicacin.......................................................................................115
XML & JSON. ..........................................................................................................................118
Crear, modificar, eliminar archivos XML & JSON. ..................................................................118
Subir archivos a Web Service o FTP. .....................................................................................122
Crear certificados y aprovisionar perfiles. ................................................................................122
Tipos de licencias de desarrollo ...........................................................................................122
Apple Developer .............................................................................................................122
iOS University Program....................................................................................................123
iOS Developer Program ...................................................................................................123
iOS Developer Enterprise Program ...................................................................................123
Crear un certificado de desarrollo........................................................................................123
Instalar un App dentro de un dispositivo. .............................................................................125
Crear un App ID ..................................................................................................................126
Asociar un App ID con un APP..............................................................................................127
3
Crear un aprovisionamiento de perfil de desarrollo. .............................................................128
Compatibilidad de versiones. ..............................................................................................129
Anexo ....................................................................................................................................130
Agregar icono a la aplicacin ...............................................................................................130
Archivar aplicacin para distribucin ...................................................................................138
Proceso de distribucin inalmbrica de apps ....................................................................138
Catlogo de apps internas ...............................................................................................138
Administracin de actualizaciones....................................................................................139
Administracin de dispositivos mviles ............................................................................139
Configurar la aplicacin en ITunes........................................................................................139
Registrarse como Apple Developer...................................................................................139
Entrando en el programa iOS Developer Program .............................................................140
Instalando Xcode: entorno de desarrollo ..........................................................................140
iOS Provisioning portal: certificados .................................................................................140
iOS Provisioning portal: dispositivos de entorno de pruebas ..............................................141
iOS Provisioning portal: App ID y Provisioning ...................................................................141
Programar la aplicacin en Objective C.............................................................................141
Probar en iPhone/iPad/iPod ............................................................................................142
Subiendo la App a App Store con iTunes Connect..............................................................142
4
Manejo de directorios
Las clases NSFileManager, NSFileHandle y NSData
NSFileManager - Esta clase puede ser utilizada para realizar operaciones bsicas con archivos o
carpetas como crear, mover, leer y escribir archivos y leer y modificar los atributos de los mismos.
Tambin cuenta con mtodos para manejar los directorios, como leer su contenido, moverlos,
borrarlos, etc.
NSFileHandle - Esta clase provee de operaciones de bajo nivel y de alto rendimiento, como
bsqueda, lectura y escritura de archivos.
NSData - Esta clase maneja un buffer donde se puede leer y escribir los datos en un archivo.
Para las clases que se mencionan, los archivos se manejan como en UNIX. Utilizamos la diagonal
(/) para separar las carpetas. Si no inicia con la diagonal, entonces se considera a partir de l
directorio actual.
La carpeta inicial (o home) del cual puede el usuario iniciar, se maneja con una tilde (~). Si un
archivo se escribe como ~/miArchivo.m se hace referencia al archivo raz del usuario. Tambin se
puede hacer la referencia a un directorio raz de un usuario por medio de la tilde, por
ejemplo ~desarroll/demo.m, busca el directorio raz del usuario "desarrollo".
La clase NSFileManager contiene un mtodo llamado defaultManager podemos obtener la
referencia a la carpeta donde se encuentra la aplicacin:
NSFileManager *raiz;
raz = [NSFileManager defaultManager];
A partir de este archivo, podemos utilizarlo de como apuntador para a partir de l, leer archivos y
directorios.
Definir el directorio actual
El directorio de trabajo se puede obtener con el mtodo currentDirectoryPath de la clase
NSFileManager. El mtodo regresa el valor como una cadena NSString:
NSFileManager *raiz;
NSString *directorioActual;
raiz = [NSFileManager defaultManager];
5
directorioActual = [raiz currentDirectoryPath];
NSLog (@"El directorio actual es %@", directorioActual);
Cambiar Directorios
Por medio del mtodo changeCurrentDirectoryPath podemos cambiar de directorio de la
aplicacin. El nuevo destino del directorio es pasada como parmetro como un objetoNSString.
Este mtodo regresar un valor Booleano (YES/NO) para indicar si el cambio se efectu en forma
exitosa o si existi un error:
NSFileManager *raiz;
NSString *dirActual;
raiz = [NSFileManager defaultManager];
dirActual = [raiz currentDirectoryPath];
NSLog (@"El directorio actual es %@", dirActual);
if ([raiz changeCurrentDirectoryPath: @"/temp/mydir"] == NO)
NSLog (@"Error al cambiar de directorio.");
dirActual = [raiz currentDirectoryPath];
NSLog (@"El directorio actual es %@", dirActual);
Crear Leer y Borrar Directorios
Crear un directorio
Podemos crear un nuevo directorio por medio del mtodo createDirectoryAtURL pasndole como
un argumento a una instancia de la clase NSURL. Podemos pasarle diferentes atributos para el
directorio:
NSFileManager *raiz;
raiz = [NSFileManager defaultManager];
NSURL *newDir = [NSURL fileURLWithPath:@"/tmp/mynewdir"];
[raiz createDirectoryAtURL: newDir withIntermediateDirectories:YES
attributes: nil error:nil];
6
El mtodo createDirectoryAtURL regresa un valor booleano indicando si la operacin fue exitosa o
no.
Borrar un directorio
Un directorio puede ser borrado del disco del sistema utilizando el mtodo removeItemAtPath,
pasando como argumento el directorio que se desee eliminar:
NSFileManager *raiz;
raiz= [NSFileManager defaultManager];
[raiz removeItemAtPath: @"/tmp/mynewdir" handler: nil];
Renombrar o mover un directorio
Un directorio puede ser movido o renombrado usando el mtodo moveItemAtURL. Este mtodo
toma como argumentos el origen y el destino por medio de objetos NSURL y es necesario que el
objeto final NO EXISTA. Si el objeto destino ya existe, el mtodo regresara un valor booleano
negativo (NO):
NSFileManager *raiz;
raiz = [NSFileManager defaultManager];
NSURL *dirOrigen= [NSURL fileURLWithPath:@"/tmp/mynewdir"];
NSURL *dirNuevo= [NSURL fileURLWithPath:@"/tmp/mynewdir2"];
[raiz moveItemAtURL: dirOriegan toURL: dirNuevo error: nil];
Listar contenido de un directorio
La lista de los archivos contenidos en un directorio se puede obtener por medio del mtodo
contentsOfDirectoryAtPath. Este mtodo toma como argumento el camino del directorio que se
desea leer como una cadena NSString y regresa un arreglo con los nombre de los archivos y
subdirectorios contenidos:
NSFileManager *raiz;
NSString *dirActual;
NSArray *listaArchivos;
int num;
7
int i;
raiz= [NSFileManager defaultManager];
listaArchivos= [raiz contentsOfDirectoryAtPath: @"/tmp" error: nil];
num= [listaArchivos count];
for (i = 0; i < num; i++)
NSLog (@"%@", [listaArchivos objectAtIndex: i]);
Obtener atributos de un archivo o directorio
Los atributos de un archivo o directorio se pueden obtener usando el mtodo
attributesOfItemAtPath. Este toma como argumentos la ruta del directorio y un objeto NSError
opcional en el que se colocar la informacin sobre cualquier error (puede especificarse como
NULL si no se requiere esta informacin). Los resultados se devuelven en forma de un objeto de
diccionario NSDictionary.
NSFileManager *filemgr;
NSDictionary *attribs;
filemgr=[NSFileManager defaultManager];
attribs=[filemgr attributesOfItemAtPath:
@"/Applications" error:Null];
NSLog (@"File Type %@",[attribs objectForKey:NSFileType]);
NSLog (@"POSIX Permissions %@",[attribs
objectForKey:NSFilePosixPermissions]);
Manejo de archivos
Uno de los temas ms importantes para hacer aplicaciones robustas con Objective-C es el manejo
de archivos.
El directorio por referencia
8
1. Primero debemos de obtener el directorio de la aplicacin, la cual por lo general la
conocemos como "home", "root" o "raiz".
2. Esta referencia raz la obtenemos con el mtodo defaultManager de la claseNSFileManager, creando una instancia de la misma:
NSFileManager *raiz;
raiz= [NSFileManager defaultManager];
Verificar si existe un archivo
1. La clase NSFileManager contiene un mtodo llamado fileExistsAtPath el cual
verifica la existencia de un archivo.
2. El mtodo toma como argumento una cadena NSString y regresar un valor
booleano verdadero (YES) si el archivo existe o un valor negativo (NO) de lo contrario:
NSFileManager *raiz;
raiz = [NSFileManager defaultManager];
if ([raiz fileExistsAtPath: @"/tmp/myfile.txt" ] == YES)
NSLog (@"Si existe el archivo");
else
NSLog (@"Archivo no encontrado");
Comparacin de dos archivos
Podemos comparar el contenido de dos archivos por medio del mtodo contentsEqualAtPath. Este
mtodo toma como argumentos al nombre y el directorio de los dos archivos. Regresa un valor
falso (NO) si es que son diferentes y un verdadero (YES) si los contenidos son iguales:
NSFileManager *raiz;
raiz= [NSFileManager defaultManager];
if ([raiz contentsEqualAtPath: @"/tmp/compras.txt" andPath:
@"/tmp/ventas.txt"] == YES)
NSLog (@"Los contenidos son iguales");
else
NSLog (@"Los contenidos son diferentes");
9
Verificando los permisos del archivo
La mayora de los sistemas operativos (de servidores, locales o de dispositivos mviles) asignan
"permisos" a cada archivo y directorio. Por medio de los siguientes mtodos podemos saber si se
cuenta con el permiso
respectivo: isReadableFileAtPath,isWritableFileAtPath, isExecutableFileAtPath y isDeletableFileAtP
ath. Cada uno regresa un valor booleano verdadero (YES) si el archivo tiene ese permiso o un falso
(NO) si no lo tiene
NSFileManager *raiz;
raiz = [NSFileManager defaultManager];
if ([raiz isWritableFileAtPath: @"/tmp/myfile.txt"] == YES)
NSLog (@"El archivo tiene permiso para ser escrito");
else
NSLog (@"El archivo es slo lectura");
Mover o renombrar un archivo
Un archivo puede ser renombrado, en caso que tenga ese permiso, usando el mtodo
moveItemAtURL. Este mtodo regresar un valor booleano verdadero (YES) si la accin de
renombrar fue exitosa y uno falso (NO) de lo contrario. Se tiene un objeto de tipo error NSError, el
cual devuelve un valor nil si la operacin fue exitosa, y un objeto de error si la operacin de
renombrar fall:
NSFileManager *raiz;
raiz = [NSFileManager defaultManager];
NSURL *dirAct = [NSURL fileURLWithPath:@"/tmp/archivoActual.txt"];
NSURL *dirNuevo= [NSURL fileURLWithPath:@"/tmp/archivoNuevo.txt"];
[raiz moveItemAtURL: dirAct toURL: dirNuevo error: nil];
10
Copiar un archivo
Por medio del mtodo copyItemAtPath es posible copiar un archivo. Los argumentos y valores de
respuesta son los mismos que en el proceso de renombrar el archivo que se vieron en el segmento
anterior.
NSFileManager *raiz;
raiz= [NSFileManager defaultManager];
if ([raiz copyItemAtPath: @"/tmp/archivoActual.txt" toPath:
@"/Users/demo/archivoNuevo.txt" error: NULL] == YES)
NSLog (@"Copia exitosa");
else
NSLog (@"Error en la copia");
Borrar un archivo
El mtodo removeItemAtPath permite borrar o remover un archivo. El mtodo toma el nombre de
archivo con su camino (opcional) y un objeto de la clase NSError. Regresa un valor booleano en
respuesta a la operacin, indicando si la misma fue exitosa (YES) o no (NO).
NSFileManager *raiz;
raiz = [NSFileManager defaultManager];
if ([raiz removeItemAtPath: @"/tmp/miArchivo.txt" error: NULL] == YES)
NSLog (@"Borrado exitoso");
else
NSLog (@"Error al borrar");
Crear un link simblico
Podemos crear un link simblico a un archivo por medio del mtodo createSymbolicLinkAtPath.
Los argumentos de este mtodo son el camino que deseamos volver link simblico, el nombre del
archivo y un objeto de la clase NSError, que regresa algn valor si la operacin no fue satisfactoria.
11
NSFileManager *raiz;
raiz = [NSFileManager defaultManager];
if ([raiz createSymbolicLinkAtPath: @"/tmp/archivo2.txt"
withDestinationPath: @"/tmp/archivo.txt" error: nil] ==
YES)
NSLog (@"Ligado exitoso");
else
NSLog (@"Error al crear el link");
Leer y escribir archivos con NSFileManager
Una forma muy bsica y limitada de leer y escribir archivos es por medio de la clase
NSFileManager.
El contenido que se va a grabar debe de estar contenido en un objeto de tipo NSData antes de
utilizar el mtodo contentsAtPath:
NSFileManager *raiz;
NSData *databuffer;
raiz = [NSFileManager defaultManager];
databuffer = [raiz contentsAtPath: @"/tmp/archivo.txt" ];
Una vez que los datos estn almacenados en el objeto NSData, podemos utilizar el
mtodo createFileAtPath para escribir el archivo:
databuffer = [raiz contentsAtPath: @"/tmp/archivo.txt" ];
[raiz createFileAtPath: @"/tmp/ArchivoNuevo.txt" contents: databuffer
attributes: nil];
Esta forma de crear un archivo no nos permite saber cunta informacin se copi ni hacer una
12
operacin de append al final del mismo. Si el archivo destino ya existe, se sobrescribe perdiendo
los datos anteriores. Una forma mucho ms robusta de grabar informacin es por medio de la clase NSFileHandle perteneciente al Framework-Fundation.
Uso de la clase NSFileHandle para la operacin con archivos
La clase NSFileHandle ofrece una amplia gama de mtodos diseados para proporcionar un
mecanismo ms avanzado para trabajar con archivos. Adems de los archivos, esta clase tambin
se puede utilizar para trabajar con dispositivos y conectores de red. En las siguientes secciones
vamos a ver algunos de los usos ms comunes de esta clase.
Crear un objeto NSFileHandle
Un objeto NSFileHandle al abrir un archivo para leer, escribir o aadir datos al final del mismo.
Para ello se pueden utilizar, respectivamente, los siguientes mtodos:
fileHandleForReadingAtPath,
fileHandleForWritingAtPath
fileHandleForUpdatingAtPath
Una vez efectuado su operacin, se deber cerrar con el mtodo closeFile. Si el proceso de
apertura del archivo falla, el mtodo regresar un valor de nil.
NSFileHandle *archivo;
archivo = [NSFileHandle fileHandleForWritingAtPath: @"/tmp/archivo.txt"];
if (archivo == nil)
NSLog(@"Error al abrir el archivo");
[archivo closeFile];
Proceso de desplazamiento (Offsets) y bsqueda (Seeking)
1. Un objeto de la clase NSFileHandle mantiene un apuntador para marcar la
posicin actual del archivo.
2. Esta posicin se le conoce como offset, o el desplazamiento del apuntador con
respecto al inicio del archivo.
3. Cuando el archivo es abierto, este apuntador se encuentra al inicio del mismo y su
valor es cero (0).
13
4. Esto quiere decir que cualquier operacin iniciar con un valor del apuntador de
cero.
5. Para efectuar una operacin en otra parte del archivo, digamos al final,
necesitamos primero buscar (seek) ese desplazamiento (offset).
6. Por ejemplo, si desea mover el apuntador al final del archivo, puede hacerlo por
medio del mtodo seekToEndOfFile .
7. Si desea mover el apuntador a un lugar en especfico, puede utilizar el mtodo
seekToFileOffset el cual le permite especificar el lugar exacto dentro del archivo.
8. Para identificar el lugar donde se encuentra el apuntador, puede hacerlo con el
mtodo offsetInFile.
9. Para que el apuntador pueda almacenar su ubicacin en un archivo muy grande,
su tipo es un entero unsigned long long.
Por ejemplo:
NSFileHandle * archivo;
archivo = [NSFileHandle fileHandleForUpdatingAtPath:
@"/tmp/archivo.txt"];
if (archivo == nil)
NSLog(@"Error al abrir el archivo");
NSLog (@"Offset = %llu", [archivo offsetInFile]);
[archivo seekToEndOfFile];
NSLog (@"Offset = %llu", [archivo offsetInFile]);
[archivo seekToFileOffset: 30];
NSLog (@"Offset = %llu", [archivo offsetInFile]);
[archivo closeFile];
Leer datos en un archivo
1. Una vez que se ha abierto el archivo y que tenemos la referencia, el contenido del
mismo puede ser ledo a partir de la posicin del apuntador (offset).
2. El mtodo readDataOfLength lee un nmero especificado de nmeros de bytes a
partir del apuntador (offset).
3. Por ejemplo, el siguiente cdigo lee 5 bytes a partir de la posicin 10 a partir del
inicio del archivo.
14
4. La informacin leda es encapsulada dentro de un objeto NSData:
NSFileHandle * archivo;
NSData *databuffer;
archivo = [NSFileHandle fileHandleForReadingAtPath: @"/tmp/archivo.txt"];
if (archivo == nil)
NSLog(@"Failed to open file");
[archivo seekToFileOffset: 10];
databuffer = [archivo readDataOfLength: 5];
[archivo closeFile];
El mtodo readDataToEndOfFile lee los datos encontrados desde el offset hasta el fin del archivo.
Escribir los datos en el archivo
El mtodo writeData escribe la informacin encontrada en un objeto NSData a partir de la
ubicacin del apuntador u offset.
Este proceso no inserta datos, ms bien los sobrescribe.
Para ver este comando en accin, cree un archivo de texto con la sentencia:
hola, cara de bola
A continuacin ejecute el siguiente cdigo:
#import
int main (int argc, const char * argv[])
{
@autoreleasepool {
NSFileHandle * archivo;
NSMutableData *data;
const char *bytestring = "black dog";
data = [NSMutableData dataWithBytes:bytestring
length:strlen(bytestring)];
15
archivo = [NSFileHandle fileHandleForUpdatingAtPath:
@"/tmp/archivo.txt"];
if (archivo == nil)
NSLog(@"Error al abrir el archivo");
[archivo seekToFileOffset: 10];
[archivo writeData: data];
[archivo closeFile];
}
return 0;
}
Abra con un editor el archivo para ver el cambio.
Truncar un archivo
Un archivo puede ser truncado por medio del mtodo truncateFileAtOffset.
Para borrar todo el contenido del archivo, el apuntador u offset deber encontrarse al inicio del
archivo, es decir, ser cero:
NSFileHandle * archivo;
archivo = [NSFileHandle fileHandleForUpdatingAtPath:
@"/tmp/archivo.txt"];
if (archivo == nil)
NSLog(@"Error al abrir el archivo");
[archivo truncateFileAtOffset: 0];
[archivo closeFile];
16
Base de Datos
El uso de las bases de datos ya se ha extendido de los servidores hacia los dispositivos
mviles. El desarrollo constante de la tecnologa conjuntamente con los nuevos
requerimientos de las empresas ha llevado a crear diversos mtodos de almacenamiento de
informacin en dispositivos mviles, embebidos y empotrados.
La demanda de bases de datos para dispositivos mviles como PDAs y telfonos celulares ha
crecido exponencialmente en los ltimos aos debido a la necesidad de las empresas de tener
la informacin al instante de lo que sucede en el campo y as responder ms rpidamente ante
la competencia. Esta necesidad ha provocado que el almacenamiento de los datos en estos
dispositivos haya mejorado tanto en capacidad como en herramientas. Gracias a esto,
actualmente contamos con diversas opciones de manejadores de bases de datos para
mviles, y una de mis favoritas es SQLite, que es en la que se enfoca este artculo.
Qu es SQLite?
SQLite es una herramienta de software libre, que permite almacenar informacin en
dispositivos empotrados de una forma sencilla, eficaz, potente, rpida y en equipos con pocas
capacidades de hardware, como puede ser una PDA o un telfono celular. SQLite implementa
el estndar SQL92 y tambin agrega extensiones que facilitan su uso en cualquier ambiente
de desarrollo. Esto permite que SQLite soporte desde las consultas ms bsicas hasta las
ms complejas del lenguaje SQL, y lo ms importante es que se puede usar tanto en
dispositivos mviles como en sistemas de escritorio, sin necesidad de realizar procesos
complejos de importacin y exportacin de datos, ya que existe compatibilidad al 100% entre
las diversas plataformas disponibles, haciendo que la portabilidad entre dispositivos y
plataformas sea transparente.
Historia
SQLite apareci en mayo del ao 2000 de la mano de su creador D. Richard Hip, quin ha
liberado las diferentes versiones de SQLite en base a la licencia GPL por lo que su cd igo es
de dominio pblico y puede ser modificado por cualquier persona. Gracias a esto, SQLite ha
sido mejorada a lo largo de 7 aos por un gran nmero de colaboradores y tambin ha sido
migrada a diversas plataformas.
Caractersticas
Estas son algunas de las caractersticas principales de SQLite:
La base de datos completa se encuentra en un solo archivo.
Puede funcionar enteramente en memoria, lo que la hace muy rpida.
Tiene un footprint menor a 230KB.
Es totalmente autocontenida (sin dependencias externas).
Cuenta con libreras de acceso para muchos lenguajes de programacin.
17
Soporta texto en formato UTF-8 y UTF-16, as como datos numricos de 64 bits.
Soporta funciones SQL definidas por el usuario (UDF).
El cdigo fuente es de dominio pblico y se encuentra muy bien documentado.
Plataformas de SQLite
SQLite est construida en C, lo cual facilita la migracin a diversas plataformas de sistemas
operativos y de dispositivos. Dado que una base de datos de SQLite se almacena por
completo en un solo archivo, est puede ser exportada a cualquier otra plataforma y tener
interoperatibilidad al 100% sin ningn requerimiento de programacin adicional o cambios de
configuracin.
Las plataformas principales dnde SQLite se encuentra funcionando son:
Windows 95, 98, ME, 2000, XP y Vista
Windows CE & Pocket PC
Mac OSX
Linux
OpenEmbedded
PalmOS
Symbian
Aplicaciones de SQLite
Las caractersticas y plataformas previamente mencionadas hacen de SQLite una excelente
opcin en diversos casos tales como:
Cuando se requiere una base de datos integrada dentro de una aplicacin. SQLite es una
excelente opcin por su facilidad de configuracin. El inconveniente es que no escala a bases
de datos demasiado grandes (en el orden de los terabytes).
Para realizar demostracin de aplicaciones que utilizan un RDBMS (Para que utilizar un
manejador de BD pesado que ocupa grandes recursos de sistema cuando solo se requiere
hacer un demo de una aplicacin?)
Como cache local de un manejador de base de datos empresarial. Esto acelera el tiempo de
respuesta y reduce la carga sobre la base de datos central.
Para aplicaciones en dispositivos mviles que manejan una BD local que se sincroniza por
batch con una base de datos remota.
Almacenamiento persistente de objetos, configuraciones y preferencias de usuario. Permite
fcilmente crear una estructura para almacenar configuraciones de la aplicacin.
18
Estructurar BD
Si deseamos conocer la estructura de una base de datos SQLite tan solo tenemos que hacer un
SELECT a la tabla sqlite_master.
Esta tabla es una tabla especial de SQLite que conserva la estructura de todo el fichero de la base
de datos, por lo tanto nos informa de todas las tablas que contiene y sus respectivos campos.
Por ejemplo, para volcar la informacin:
SELECT * FROM sqlite_master
Y para ver la definicin (en formato SQL) de la tablas, realizamos una consulta sobre el
campo sql del tipo table con:
SELECT sql FROM sqlite_master WHERE type='table'
Abrir o Crear una BD.
En primer lugar, necesitamos crear las tablas de nuestra base de datos. Para ello, nos
descargaremos el addon de Firefox SQLite Database Manager. Si no utilizamos Firefox, tambin
podemos descargar un gestor desde SQLAbs. Ejecutamos el addon y creamos una nueva base de
datos, utilizando el botn que se indica en la imagen:
19
Elegimos el nombre que queramos. Una vez aceptemos, nos crear un fichero .sqlite con el
nombre que hayamos elegido en la ubicacin que queramos. Para este ejemplo, hemos elegido el
nombre vehiculos.sqlite.
Crear Tabla de BD.
A continuacin hacemos click en el botn de Crear Tabla y podremos crear la primera tabla de
nuestra nueva base de datos. Rellenamos los campos tal y como se ve en la siguiente imagen:
Prepara y Ejecutar sentencias SQL
Una vez creada nuestra tabla, vamos a insertar algunos datos de prueba en ella. Para ello,
desplegamos la seccin de Tables y despus seleccionamos nuestra tabla. Con nuestra tabla
seleccionada, en la parte derecha de la ventana veremos un botn que nos permitir aadir una
nueva fila a la tabla. En la siguiente imagen vemos de qu botn se trata:
20
Nos aparecer una ventana con los tres campos de la tabla para rellenar. Insertamos los datos que
queramos (para este ejercicio, con tres vehculos nos bastar) rellenando todos los campos y
confirmando los cambios cuando el programa nos lo pida. Repetimos la operacin hasta completar
el nmero de vehculos que queramos. Para finalizar, una vez hayamos insertado el ltimo,
hacemos click en el botn de cancelar y nos aparecer lo siguiente por pantalla:
21
Con esto terminan nuestras operaciones con el gestor de base de datos.
Integrar SQL Lite en proyecto
A continuacin vamos a crear el proyecto de XCode con el que crearemos nuestra aplicacin.
Elegimos un proyecto de tipo Single View Application y lo nombramos como queramos, en este
caso hemos elegido el nombre VehiculosCRUD. Indicaremos que la aplicacin ser para iPhone,
utilizar Storyboards y tambin utilizar ARC.
Una vez hayamos creado el proyecto, nos dirigimos a la seccin de Linked Frameworks and
Libraries y aadimos una nueva entrada con el botn +. En el buscador que se nos abre, buscamos
la librera libsqlite3.0.dylib y la aadimos. Ahora, buscamos el fichero que contiene nuestra base
de datos, la cual hemos creado antes y lo arrastramos a la lista de ficheros del proyecto. En la
pantalla que aparece, dejamos las opciones tal y como se ven en la siguiente imagen:
22
Ahora vamos a crear las operaciones. Primero crearemos un grupo y lo haremos desde el men
File y seleccionando la opcin New Group. Le pondremos como nombre modelo. Una vez creado el
nuevo grupo, crearemos la clase que nos mapear la tabla de vehculo. La clase la crearemos
seleccionando el nuevo grupo y, desde el men contextual, seleccionaremos New File. Elegimos
Objective-C class, le indicamos que ser una subclase de NSObject y la llamaremos Vehiculo. Una
vez la creemos, le aadimos las propiedades necesarias para mapear los campos de la tabla de
base de datos, tal y como podemos ver en el siguiente cdigo:
Vehiculo.h
#import
@interface Vehiculo : NSObject{
NSInteger vehiculoID;
NSString *nombreVehiculo;
NSInteger numeroRuedas;
}
@property (nonatomic, assign) NSInteger vehiculoID;
@property (nonatomic, retain) NSString *nombreVehiculo;
@property (nonatomic, assign) NSInteger numeroRuedas;
@end
23
Vehiculo.m
#import "Vehiculo.h"
@implementation Vehiculo
@synthesize vehiculoID;
@synthesize nombreVehiculo;
@synthesize numeroRuedas;
@end
A continuacin creamos la clase que nos permitir realizar las operaciones contra la base de datos.
Esta clase tambin la crearemos dentro del grupo modelo. Repetimos la misma operacin con la
que creamos la clase Vehiculo: Objective-C class, subclase de NSObject y la llamaremos
VehiculoDAO.
Extraer informacin de una BD.
Una vez creada, le aadiremos las propiedades necesarias y definiremos los mtodos de obtener
datos y obtener la ruta de base de datos, tal y como podemos ver en el siguiente cdigo:
VehiculoDAO.h
#import
#import
@interface VehiculoDAO : NSObject{
sqlite3 *bd;
}
- (NSMutableArray *) obtenerVehiculos;
- (NSString *) obtenerRutaBD;
@end
VehiculoDAO.m
#import "VehiculoDAO.h"
#import "Vehiculo.h"
@implementation VehiculoDAO
- (NSString *) obtenerRutaBD{
NSString *dirDocs;
NSArray *rutas;
NSString *rutaBD;
rutas = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
dirDocs = [rutas objectAtIndex:0];
24
NSFileManager *fileMgr = [NSFileManager defaultManager];
rutaBD = [[NSString alloc] initWithString:[dirDocs
stringByAppendingPathComponent:@"vehiculos.sqlite"]];
if([fileMgr fileExistsAtPath:rutaBD] == NO){
[fileMgr copyItemAtPath:[[[NSBundle mainBundle] resourcePath]
stringByAppendingPathComponent:@"vehiculos.sqlite"] toPath:rutaBD
error:NULL];
}
return rutaBD;
}
- (NSMutableArray *) obtenerVehiculos{
NSMutableArray *listaVehiculos = [[NSMutableArray alloc] init];
NSString *ubicacionDB = [self obtenerRutaBD];
if(!(sqlite3_open([ubicacionDB UTF8String], &bd) == SQLITE_OK)){
NSLog(@"No se puede conectar con la BD");
}
const char *sentenciaSQL = "SELECT id, nombre_vehiculo,
numero_ruedas FROM vehiculo";
sqlite3_stmt *sqlStatement;
if(sqlite3_prepare_v2(bd, sentenciaSQL, -1, &sqlStatement, NULL)
!= SQLITE_OK){
NSLog(@"Problema al preparar el statement");
}
while(sqlite3_step(sqlStatement) == SQLITE_ROW){
Vehiculo *vehiculo = [[Vehiculo alloc] init];
vehiculo.vehiculoID = sqlite3_column_int(sqlStatement, 0);
vehiculo.nombreVehiculo = [NSString
stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 1)];
vehiculo.numeroRuedas = sqlite3_column_int(sqlStatement,
2);
[listaVehiculos addObject:vehiculo];
}
return listaVehiculos;
}
Hemos creado el mtodo obtenerRutaBD el cual usaremos en la segunda parte del ejercicio, en el
que realizaremos inserciones, modificaciones y borrados. El propsito de este mtodo es el de
copiar al directorio de Documents del dispositivo el fichero .sqlite siempre y cuando ste no
exista. Esto es debido a que no se puede escribir en ficheros que se encuentren en la raz de la
aplicacin (main bundle) ya que es de slo lectura. Por otro lado, en el mtodo obtenerVehiculos
podemos ver cmo se obtiene la ruta de nuestro fichero de base de datos, se abre la conexin, se
prepara la sentencia y se lanza. Todo esto puede hacerse gracias a los mtodos sqlite3_open,
sqlite3_prepare_v2 y sqlite3_step.
25
Ahora crearemos nuestro storyboard para poder gestionar todas estas operaciones. Primero de
todo, aadiremos a nuestro storyboard un TableViewController. Una vez aadido, seleccionamos el
controller y una vez hecho esto, abrimos el men Editor y seleccionamos la opcin Embed In ->
Navigation Controller. Tambin aadiremos un ViewController al storyboard, y a este nuevo
ViewController le aadimos dos UILabel y dos UITextField y le ponemos como identificador el
nombre visualizacin, quedando finalmente nuestro storyboard tal y como muestra la siguiente
imagen:
Tambin seleccionamos la celda del TableViewController y le ponemos como identificador el
nombre celda.
Ahora vamos a centrarnos en mostrar datos en el TableViewController. Lo primero que haremos
ser crear una nueva clase que sea una subclase de UITableViewController, la
llamaremos ListaVehiculosViewController y en nuestro storyboard se la asignaremos al
TableViewController. En esta nueva clase definiremos un objeto de tipo VehiculoDAO y otro de
tipo NSMutableArray. En el mtodo viewDidLoad inicializaremos estos dos objetos y, una vez
inicializados, lanzaremos una consulta para que nos devuelva todos los vehculos de nuestra tabla
con este cdigo:
ListaVehiculosViewController.h
#import
#import "VehiculoDAO.h"
@interface ListaVehiculosViewController : UITableViewController{
VehiculoDAO *dao;
NSMutableArray *vehiculos;
}
@property (nonatomic, strong) VehiculoDAO *dao;
@property (nonatomic, strong) NSMutableArray *vehiculos;
@end
ListaVehiculosViewController.m
26
@synthesize dao;
@synthesize vehiculos;
- (void)viewDidLoad
{
dao = [[VehiculoDAO alloc] init];
vehiculos = [[NSMutableArray alloc] init];
vehiculos = [dao obtenerVehiculos];
[super viewDidLoad];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
return [vehiculos count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"celda";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
cell.textLabel.text = [[vehiculos objectAtIndex:[indexPath row]]
valueForKey:@"nombreVehiculo"];
return cell;
}
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
ModVehiculoViewController *destino = [self.storyboard
instantiateViewControllerWithIdentifier:@"visualizacion"];
Vehiculo *tmp = [vehiculos objectAtIndex:[indexPath row]];
destino.vehiculo = tmp;
[self.navigationController pushViewController:destino animated:YES];
}
Como podemos ver en el cdigo, le indicaremos que slo tendr una seccin y el nmero de filas
ser el tamao del array que nos devuelva la consulta. Tambin hemos implementado el mtodo
didSelectRowAtIndexPath para hacer la transicin desde la celda hasta el ViewController que nos
ensear los datos del vehculo.
27
Por ltimo, nos centraremos en el ViewController de destino. Para ello, vamos a aprovecharnos de
la clase ViewController que se crea por defecto cuando creamos el proyecto. Primero de todo, la
renombramos a ModVehiculoViewController y se la asignamos en el storyboard al ViewController.
Una vez hecho esto, en la clase definiremos los IBOutlet necesarios, un objeto de
tipo VehiculoDAO y otro objeto de tipo Vehiculo. Por ltimo, definiremos tambin un mtodo para
ocultar el teclado. La clase quedar como puede verse en el siguiente cdigo:
ModVehiculoViewController.h
#import
#import "VehiculoDAO.h"
#import "Vehiculo.h"
@interface ModVehiculoViewController : UIViewController{
IBOutlet UILabel *etqNombre;
IBOutlet UILabel *etqRuedas;
IBOutlet UITextField *txtNombre;
IBOutlet UITextField *txtRuedas;
VehiculoDAO *dao;
Vehiculo *vehiculo;
}
@property (nonatomic, strong) IBOutlet UILabel *etqNombre;
@property (nonatomic, strong) IBOutlet UILabel *etqRuedas;
@property (nonatomic, strong) IBOutlet UITextField *txtNombre;
@property (nonatomic, strong) IBOutlet UITextField *txtRuedas;
@property (nonatomic, strong) Vehiculo *vehiculo;
@property (nonatomic, strong) VehiculoDAO *dao;
- (IBAction) ocultarTeclado:(id)sender;
@end
ModVehiculoViewController.m
@synthesize etqNombre;
@synthesize etqRuedas;
@synthesize txtNombre;
@synthesize txtRuedas;
@synthesize dao;
@synthesize vehiculo;
-(void) touchesBegan :(NSSet *) touches withEvent:(UIEvent *)event{
[txtNombre resignFirstResponder];
[txtRuedas resignFirstResponder];
[super touchesBegan:touches withEvent:event ];
}
- (IBAction)ocultarTeclado:(id)sender{
}
- (void)viewDidLoad
{
[txtNombre setText:vehiculo.nombreVehiculo];
28
[txtRuedas setText:[NSString stringWithFormat:@"%d",
vehiculo.numeroRuedas]];
[txtRuedas setKeyboardType:UIKeyboardTypeNumberPad];
dao = [[VehiculoDAO alloc] init];
[super viewDidLoad];
}
Y con esto ya tenemos la primera parte del ejercicio. Bastar con ejecutar el simulador para ver el
resultado:
29
Ahora vamos a hacer va completar la clase VehiculoDAO aadindole los mtodos necesarios
para realizar el resto de operaciones. El cdigo fuente a aadir es el siguiente:
VehiculoDAO.h
- (void) crearVehiculo: (NSString *)nombre ruedas:(NSInteger) ruedas;
- (void) actualizarVehiculo: (NSInteger) vehiculoID nombre:(NSString
*)nombre ruedas:(NSInteger) ruedas;
- (void) borrarVehiculo: (NSInteger) vehiculoID;
VehiculoDAO.m
- (void) crearVehiculo:(NSString *)nombre ruedas:(NSInteger)ruedas{
NSString *ubicacionDB = [self obtenerRutaBD];
if(!(sqlite3_open([ubicacionDB UTF8String], &bd) == SQLITE_OK)){
NSLog(@"No se puede conectar con la BD");
return;
} else {
NSString *sqlInsert = [NSString stringWithFormat:@"INSERT INTO
vehiculo (nombre_vehiculo, numero_ruedas) VALUES ('%@', %d)", nombre,
ruedas];
const char *sql = [sqlInsert UTF8String];
sqlite3_stmt *sqlStatement;
if(sqlite3_prepare_v2(bd, sql, -1, &sqlStatement, NULL) !=
SQLITE_OK){
NSLog(@"Problema al preparar el statement");
return;
} else {
if(sqlite3_step(sqlStatement) == SQLITE_DONE){
sqlite3_finalize(sqlStatement);
sqlite3_close(bd);
}
}
}
}
- (void) actualizarVehiculo:(NSInteger) vehiculoID nombre:(NSString
*)nombre ruedas:(NSInteger)ruedas{
NSString *ubicacionBD = [self obtenerRutaBD];
if(!(sqlite3_open([ubicacionBD UTF8String], &bd) == SQLITE_OK)){
NSLog(@"No se puede conectar con la BD");
return;
} else {
NSString *sqlUpdate = [NSString stringWithFormat:@"UPDATE vehiculo
SET nombre_vehiculo = '%@', numero_ruedas = %d WHERE id = %d", nombre,
ruedas, vehiculoID];
const char *sql = [sqlUpdate UTF8String];
sqlite3_stmt *sqlStatement;
if(sqlite3_prepare_v2(bd, sql, -1, &sqlStatement, NULL) !=
SQLITE_OK){
NSLog(@"Problema al preparar el statement.");
return;
} else {
30
if(sqlite3_step(sqlStatement) == SQLITE_DONE){
sqlite3_finalize(sqlStatement);
sqlite3_close(bd);
}
}
}
}
- (void) borrarVehiculo:(NSInteger) vehiculoID{
NSString *ubicacionBD = [self obtenerRutaBD];
if(!(sqlite3_open([ubicacionBD UTF8String], &bd) == SQLITE_OK)){
NSLog(@"No se puede conectar con la BD");
return;
} else {
NSString *sqlDelete = [NSString stringWithFormat:@"DELETE FROM
vehiculo WHERE id = %d", vehiculoID];
const char *sql = [sqlDelete UTF8String];
sqlite3_stmt *sqlStatement;
if(sqlite3_prepare_v2(bd, sql, -1, &sqlStatement, NULL) !=
SQLITE_OK){
NSLog(@"Problema al preparar el statement.");
return;
} else {
if(sqlite3_step(sqlStatement) == SQLITE_DONE){
sqlite3_finalize(sqlStatement);
sqlite3_close(bd);
}
}
}
}
Como podemos ver, en estos mtodos se hacen prcticamente los mismos pasos que en el
mtodo de consulta, lo nico que cambia es qu sentencia SQL se lanza y el procesamiento final.
Ahora vamos a dirigirnos al storyboard y aadiremos un nuevo ViewController. A este
ViewController le aadiremos dos UILabel, dos UITextField y un UIButton. El ViewController
deber quedar as:
31
A continuacin vamos a crear una nueva clase en nuestro proyecto y la llamaremos
AltaVehiculoViewController y se la asignamos en el storyboard a este nuevo ViewController. Una
vez renombrada, definimos los IBOutlet necesarios y definimos el IBAction correspondiente al alta
de un nuevo elemento. Tambin definiremos un objeto de tipo VehiculoDAO, el cual nos
permitir conectar con la base de datos y lanzar las operaciones necesarias. En el mtodo
viewDidLoad inicializaremos el dao y ya estar listo para utilizarse. Ahora slo queda programar el
proceso de alta y ste es el cdigo que nos permitir hacerlo:
AltaVehiculoViewController.h
#import
#import "VehiculoDAO.h"
@interface AltaVehiculoViewController : UIViewController{
IBOutlet UILabel *etqNombre;
IBOutlet UILabel *etqRuedas;
IBOutlet UITextField *txtNombre;
IBOutlet UITextField *txtRuedas;
IBOutlet UIButton *btnCrear;
32
VehiculoDAO *dao;
}
@property (nonatomic, strong) IBOutlet UILabel *etqNombre;
@property (nonatomic, strong) IBOutlet UILabel *etqRuedas;
@property (nonatomic, strong) IBOutlet UITextField *txtNombre;
@property (nonatomic, strong) IBOutlet UITextField *txtRuedas;
@property (nonatomic, strong) IBOutlet UIButton *btnCrear;
@property (nonatomic, strong) VehiculoDAO *dao;
- (IBAction) ocultarTeclado:(id)sender;
- (IBAction) crearNuevoVehiculo:(id)sender;
@end
AltaVehiculoViewController.m
@synthesize etqNombre;
@synthesize etqRuedas;
@synthesize txtNombre;
@synthesize txtRuedas;
@synthesize btnCrear;
@synthesize dao;
-(void) touchesBegan :(NSSet *) touches withEvent:(UIEvent *)event{
[txtNombre resignFirstResponder];
[txtRuedas resignFirstResponder];
[super touchesBegan:touches withEvent:event ];
}
- (void)viewDidLoad{
dao = [[VehiculoDAO alloc] init];
[txtRuedas setKeyboardType:UIKeyboardTypeNumberPad];
[super viewDidLoad];
}
- (IBAction)ocultarTeclado:(id)sender{
}
- (IBAction) crearNuevoVehiculo:(id)sender{
NSString *nombre = [NSString stringWithFormat:txtNombre.text];
NSInteger ruedas = [txtRuedas.text integerValue];
[dao crearVehiculo:nombre ruedas:ruedas];
}
Hacemos los enlaces correspondientes en el storyboard, acordndonos de asociar todos los
mtodos (incluido el de ocultar el teclado) y ya tendremos lista esta clase. Nos volvemos a ir al
storyboard y en el TableViewController aadiremos un botn del tipo Bar Button Item en la barra
de navegacin. Uniremos este botn con el ViewController que acabamos de aadir mediante un
segue de tipo Push. Para ello, seleccionamos el botn y, con la tecla Control apretada, arrastramos
33
el ratn hacia el controller de destino. En el men desplegable que aparece, seleccionamos Push y
ya tendremos unidos el TableViewController y el ViewController de altas.
Nos dirigimos al ViewController que utilizamos en la primera parte como detalle de datos y le
aadiremos dos UIButton, uno para modificar y otro para borrar. Tambin hemos de editar la
clase ModVehiculoViewController para aadirle estos dos botones y los dos nuevos mtodos,
uno para borrar y otro para modificar un vehculo. Esto lo podemos ver en el siguiente cdigo:
ModVehiculoViewController.h
@interface ModVehiculoViewController : UIViewController{
IBOutlet UIButton *btnModificar;
IBOutlet UIButton *btnBorrar;
}
@property (nonatomic, strong) IBOutlet UIButton *btnModificar;
@property (nonatomic, strong) IBOutlet UIButton *btnBorrar;
- (IBAction) modificarVehiculo:(id)sender;
- (IBAction) borrarVehiculo:(id)sender;
ModVehiculoViewController.m
@synthesize btnModificar;
@synthesize btnBorrar;
- (IBAction)modificarVehiculo:(id)sender{
NSInteger vehiculoID = vehiculo.vehiculoID;
NSString *nombre = txtNombre.text;
NSInteger numRuedas = [txtRuedas.text integerValue];
[dao actualizarVehiculo:vehiculoID nombre:nombre
ruedas:numRuedas];
}
- (IBAction)borrarVehiculo:(id)sender{
NSInteger vehiculoID = vehiculo.vehiculoID;
[dao borrarVehiculo:vehiculoID];
}
Hacemos los enlaces correspondientes en el storyboard, incluyendo los actions que lanzar cada
botn y con esto ya tendremos listo nuestro ViewController para modificar y borrar datos. Una vez
hecho este montaje, el storyboard quedar as:
34
Una vez hechas todas estas acciones, ya tenemos lista nuestra aplicacin para hacer altas, bajas,
modificaciones y consultas contra una base de datos SQLite. Para aportar ms informacin,
podemos aadir una alerta cuando se haga cada operacin que suponga persistencia sobre la base
de datos. Slo nos queda ejecutar el simulador para ver el resultado:
35
Multitouch, Tap, y Gestos
Gestos, Taps y Touches
Un reconocedor de gesto (gesture) es en realidad un objeto de la clase abstracta
UIGestureRecognizer. Tal objeto se relaciona con una vista, y con monitores para gestos
predefinidos que existen en la vista. Yendo un nivel ms profundo, se puede decir que los gestos
son en realidad toques (touch) y movimientos de uno o ms dedos que suceden en un rea
especfica de la pantalla, donde existe una vista. En las primeras versiones de iOS SDK, los
reconocedores de gestos no fueron proporcionados a los desarrolladores, por lo que la aplicacin
de esas formas de interaccin requiere mucho trabajo manual. Afortunadamente, Apple ha
envuelto todo ese trabajo manual y se lo dio a los desarrolladores como una sola herramienta, y
de esa manera el trabajo con gestos se convirti en una parte realmente fcil de la programacin
iOS.
La clase UIGestureRecognizer en resumen, no se puede utilizar directame nte. Hay subclases
especficas que se proporcionan para su uso, y cada uno de ellos se ocupa para un tipo especfico
de gesto. Vamos a revisar cada uno de ellos y sabremos que hace cada uno:
UITapGestureRecognizer: Esta clase se refiere a los tap(golpecito) gestos realizados en una vista.
Se puede utilizar para manejar simples o multiples taps, ya sea con uno o ms dedos. Tapping es
uno de los gestos ms habituales que los usuarios hacen.
UISwipeGestureRecognizer: Otro gesto importante es el swipe (golpe), y existe esta clase slo
para l. Swiping sucede al arrastrar un dedo hacia una direccin (derecha, izquierda, arriba y
abajo). Existe un ejemplo caracterstico del gesto de deslizar en la aplicacin Fotos, donde
utilizamos nuestros dedos a deslizarse de una foto a otra.
UIPanGestureRecognizer: El gesto pan es en realidad un gesto de arrastrar. Se utiliza cuando es
necesario para arrastrar vistas desde un punto a otro.
UIPinchGestureRecognizer: Al ver las fotos en la aplicacin Fotos y utiliza sus dos dedos para
acercar o alejar a una foto, esto es realizar un gesto de pellizco. Como ustedes comprendern,
pellizcos requiere dos dedos. Un objeto de esta clase es generalmente til para cambiar la
transformacin de una vista, y ms especficamente su escala. Usando gestos de pellizco por
ejemplo, se puede aplicar el zoom dentro y fuera de las fotos en sus propias aplicaciones.
UIRotationGestureRecognizer: De acuerdo con el gesto anterior, la rotacin se utiliza para girar
una vista usando dos dedos.
36
UILongPressGestureRecognizer: Una clase que monitorea un gesto de prensa que tarda mucho en
una vista. El prensado debe durar lo suficiente para ser detectado, y el dedo o dedos no deben
moverse mucho alrededor del punto pulsado de lo contrario el gesto falla.
UIScreenEdgePanGestureRecognizer: ste es similar al gesto de golpe, pero con una gran
diferencia: el movimiento de los dedos debe comenzar siempre desde un borde de la pantalla.
Todos los objetos de tipo gesto realizan una accin una vez que se detecta un gesto vlido. Este
puede ser en un mtodo IBAction en caso de que se aada el gesto a travs de la Interface Builder,
o un mtodo privado o pblico en caso de implementacin programtica. Cuando se llama a una
accin de un mtodo despus de que un gesto ha sucedido, el objeto gesto siempre enva a s
mismo informacin adicional que se requiere cuando se manipule el gesto. Algunas de las
siguientes firmas de los mtodos son vlidos:
-(void)handleMyTapGesture;
-(void)handleMyTapGestureWithGestureRecognizer:(UITapGestureRecognizer
*)gestureRecognizer;
En el segundo caso, el argumento gestureRecognizer le puede proporcionar informacin adicional
que pueda necesitar, como en qu lugar se ejecuto el gesto.
Mirando ahora desde otro punto, una vista puede contener ms de un reconocedor de gesto. Por
ejemplo, puede agregar dos reconocedores de pellizco y gesto de rotacin a un imageview, por lo
que se puede hacer zoom in / out y girar la imagen presentada. Sin embargo, puede ocurrir un
solo gesto en un momento dado. Los Reconocedores de Gesto que estn relacionados con una
vista se aaden a una matriz, para que puedan acceder a ellos como lo hara para cualquier objeto
a una matriz normal.
37
Crear una aplicacin con Gestos.
Vamos a comenzar por la creacin de un nuevo proyecto en Xcode. Seleccionaremos una
aplicacin por pestaas(Tabs) como plantilla para el proyecto.
A continuacin, estableceremos como nombre GesturesDemo como al proyecto, y asegurarnos de
que este seleccionado iPhone como dispositivo
38
.
Seleccionaremos el directorio donde se almacenar el proyecto y es todo.
Ahora que el proyecto est listo, vamos a configurar la interfaz con la que trabajaremos mas tarde
para el reconocimiento de gestos. De clic sobre el archivo Main.storyboard, y con ello aparecer la
diseador de interfaz (Interface Builder). Como se observa, hay dos controladores de vista
conectados al controlador barra de pestaas, as que tenemos que aadir tres ms. Desde la
biblioteca de objetos, arrastre y suelte tres nuevos objetos View Controller al canvas IB.
Antes de conectamos a los controladores de vista de la barra de pestaas, debemos crear las clases
de controlador necesarias. Comencemos por seleccionar las clases FirstViewController y
SecondViewController (tanto el .h y archivos .m) en el Navegador de proyectos, y luego pulsa la
tecla Supr del teclado. No vamos a utilizar estos archivos, vamos a crear nuevas clases para los
reconocedores de gesto que vamos a trabajar.
39
En el cuadro de dilogo de confirmacin que aparece, haga clic en el botn Mover a la Papelera.
A continuacin, aadimos las nuevas clases al proyecto. El procedimiento que se presenta se debe
repetir cinco veces en total, hasta que todas las clases necesarias se hayan aadido al proyecto.
Vamos a ver los detalles de la primera:
Abra el men File> New> File ... y seleccione crear una nueva clase de Objective-C.
40
Da clic en Next y en el campo Subclass, asegrate que este seleccionado el valor UIViewController.
En seguida coloca el nombre a la clase TapViewController en el campo clase
41
Procede al ltimo paso, y haz clic en el botn Crear para poder terminar con el asistente y dejar
que Xcode cre y agregue la nueva clase al proyecto.
Generar los siguientes controladores con los siguientes nombres de las clases:
SwipeViewController
PanViewController
PinchViewController
RotationViewController
Despus de haber agregado todos ellos, as es como el Navegador de proyectos debe aparecer:
Ahora podemos volver al Interface Builder. En primer lugar, asegrese de que el panel Utili ties
est activo, ya que lo necesitar. A continuacin, seleccione el primer view controller creado
(vamos a empezar desde arriba hacia abajo), y se muestra el Inspector de identidad(Identity
Inspector) en el panel de Utilidades. All, en el campo Clase de la seccin de clase personalizada,
defina el nombre de la primera clase que ha aadido al proyecto, el * TapViewController:
42
Repita el paso anterior hasta que establezca todas las clases personalizadas a los controladores de
vista restantes.
Nuestro prximo paso es conectar todos los controladores de vista al controlador de la barra de
pestaas. Esto se puede hacer muy fcilmente, si se selecciona el controlador de la barra de
pestaas y luego se abre el Inspector Conexiones en el panel Utilidades. La seccin Segues Se
activa, haga clic en el crculo de la derecha de la opcin de los controladores de vista y arrastre en
la parte superior de cada controlador de vista que no est conectado, y proceder al conectarlos
uno por uno.
43
Una vez que se han realizado todas las conexiones, puede establecer los ttulos de los elementos
de los botones de barras de los controladores de vista. Empieza de la parte superior a la inferior,
seleccione el elemento de la barra de pestaas y abra el inspector de atributos en el panel de
Utilidades. All, establezca el ttulo propiamente para cada controlador de vista, y establecer la
primera como la imagen de todos los controladores de vista.
44
Los ttulos de los elementos de la barra de pestaas debe estar en el siguiente orden:
Tap
Swipe
Pan
Pinch
Rotation
Por ltimo, eliminar el contenido existente en los dos primeros controladores de vista pre -hechos.
Todo est listo ahora. Opcionalmente, se puede aadir una etiqueta como un ttulo para cada
controlador de vista. Si te gustara hacer eso tambin, a continuacin, arrastre un objeto UILabel a
cada controlador de vista y establecer los siguientes atributos:
Frame : X=20, Y=40, Width=280, Height=40
Font: System Bold, 20pt
Alignment: Center
Los textos de las etiquetas deben ser (siguiendo el mismo orden que antes):
45
Tap Gesture
Swipe Gesture
Pan Gesture
Pinch Gesture
Rotation Gesture
Ahora que tenemos la configuracin, podemos pasar directamente al corazn de nuestro tema.
Sin embargo, vamos a regresar varias veces aqu al Interface Builder con el objetivo de crear los
puntos de vista de las pruebas necesarias para cada reconocedor de gesto.
Detectar Gestos dentro de la pantalla
Empezamos la exploracin real del tema con el tap gesture recognizer. En la parte anterior, se ha
aadido todos los controladores de vista necesarios para el proyecto y estn conectados con el
controlador de la barra de pestaas. Ahora, en esta parte, vamos a aadir un objeto de vista
(UIView) al controlador de vista Tap, que usaremos como una vista de prueba con el fin de hacer
nuestro trabajo en el cdigo.
46
En primer lugar, asegrese de que usted tiene el Interface Builder todava haciendo clic en el
archivo Main.storyboard en el Navegador de proyectos. A continuacin, llevar la escena del
controlador de vista al Tap View Controller, y luego seleccionar un objeto UIView de la Biblioteca
de objetos y arrastrarlo a la vista. Establezca las siguientes propiedades:
Frame : X=110, Y=234, Width=100, Height=100
Background Color: R=215, G=116, B=52
Ahora que la vista est en su lugar, tenemos que crear una propiedad IBOutlet y conectarlo con la
vista. Abra el archivo TapViewController.h y declarar la siguiente propiedad:
@interface TapViewController : UIViewController @property (weak, nonatomic) IBOutlet UIView *testView;
@end
Regrese al archivo Main.storyboard de nuevo, vaya al panel Esquema del documento, y Ctrl -
Arrastre desde el punto de vista Toque escena controlador de objeto a la vista, como se muestra a
continuacin:
47
En la ventana emergente, slo tienes que seleccionar la propiedad TestView, y ya est todo.
48
Nota: Nosotros vamos a utilizar el procedimiento anterior para aadir objetos de prueba y para
conectarlos con propiedades IBOutlet.
Ahora, abra el archivo TapViewController.m. Lo primero que debemos hacer, es crear un objeto de
la clase UITapGestureRecognizer, que luego aadiremos a la vista TestView. En realidad, vamos a
crear dos objetos de esa clase, uno para pruebas de taps individuales, y uno para probar dobles
taps. Nuestro trabajo se llevar a cabo inicialmente con el mtodo viewDidLoad, as que vamos a
empezar con la primera.
El siguiente segmento de cdigo muestra claramente cmo inicializamos un objeto gesto
reconocedor:
UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapGesture:)];
Al usarlo de esta forma, se puede inicializar cualquier objeto de las subclases del gesture, siempre
y cuando se sustituye el nombre de la clase. Como ves, especificamos un objetivo y una acci n. La
accin en este caso es un mtodo privado que estamos a punto de crear.
Para asignar el gesto anterior al test view, esto es lo que debemos escribir:
[self.testView addGestureRecognizer:singleTapGestureRecognizer];
El addGestureRecognizer: es l nico mtodo para aadir un objeto de tipo gesto a una vista.
Ve ahora a la seccin privada de la interfaz, y para declarar el mtodo privado de la siguiente
manera:
@interface TapViewController () -(void)handleSingleTapGesture:(UITapGestureRecognizer *)tapGestureRecognizer;
@end
Como se menciono en la introduccin, el objeto reconocedor de gestos hace pasar al mtodo de
seleccin, y mediante el uso de esta firma de mtodo se puede usar posteriormente en la
aplicacin.
Hacemos ms que el doble de la anchura de la vista de prueba cuando hacemos tapping en l una
vez, y vamos a revertir el valor de la anchura original tras el segundo toque:
-(void)handleSingleTapGesture:(UITapGestureRecognizer *)tapGestureRecognizer{ CGFloat newWidth = 100.0; if (self.testView.frame.size.width == 100.0) { newWidth = 200.0; } CGPoint currentCenter = self.testView.center;
49
self.testView.frame = CGRectMake(self.testView.frame.origin.x, self.testView.frame.origin.y, newWidth, self.testView.frame.size.height); self.testView.center = currentCenter;
}
Comprobamos si el ancho inicial de la vista es igual a 100,0 puntos, y si es as lo hacemos 200.0, si
no mantenemos el valor asignado inicial (100,0). A continuacin, nos atenemos a una variable de
estructura CGPoint el punto central actual, cambiamos el ancho de la vista y nos centramos de
nuevo.
Ahora es el momento de probar el tap del gesto. Ejecutar la aplicacin, y una vez que se puso en
marcha ya sea al simulador o un dispositivo, asegrese de que usted est en la primera ficha. Pulse
sobre la vista una vez, y su tamao va a cambiar. Toque una vez ms, y ver que volver a su estado
original.
Volvamos a nuestro trabajo de nuevo. Como se ha mencionado, un tap gesture se puede realizar
con uno o ms dedos, y el gesto podra requerir uno o ms taps. As que, veremos un ejemplo ms,
donde esta vez vamos a "decirle" al objeto reconocedor gesto que queremos dos taps que
50
sucedan, y que dos dedos se requieren para llevar a cabo la accin predefinida. En el mtodo
viewDidLoad, agregue las siguientes:
- (void)viewDidLoad { ... UITapGestureRecognizer *doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTapGesture:)]; doubleTapGestureRecognizer.numberOfTapsRequired = 2; doubleTapGestureRecognizer.numberOfTouchesRequired = 2; [self.testView addGestureRecognizer:doubleTapGestureRecognizer]; }
Aqu inicializamos un objeto nuevo reconocedor de tap gesture y especificamos otro mtodo de
accin que vamos a poner en prctica. Lo nuevo aqu es sin embargo el uso de las dos propiedades
que nos permiten establecer el nmero de los grifos y toques necesarios (o en otras palabras, el
nmero de dedos). Finalmente, aadimos el objeto reconocedor a la vista TestView.
Tenga en cuenta que nuestra visin de prueba ahora contiene dos objetos gesto reconocedor.
Ahora, vamos a poder terminar con las tareas pendientes. Vaya a la seccin inte rfaz privada y
declarar el nuevo mtodo privado:
@interface TapViewController ()
...
-
(void)handleDoubleTapGesture:(UITapGestureRecognizer *)tapGestureRecogni
zer;
@end
En su definicin, vamos a cambiar la anchura y la altura de la vista al duplicar su tamao. Vamos a
seguir la misma lgica que antes:
-(void)handleDoubleTapGesture:(UITapGestureRecognizer *)tapGestureRecognizer{ CGSize newSize = CGSizeMake(100.0, 100.0); if (self.testView.frame.size.width == 100.0) { newSize.width = 200.0;
51
newSize.height = 200.0; } CGPoint currentCenter = self.testView.center; self.testView.frame = CGRectMake(self.testView.frame.origin.x, self.testView.frame.origin.y, newSize.width, newSize.height); self.testView.center = currentCenter; }
Ejecutar la aplicacin una vez ms. Esta vez, tocar dos veces y usar dos dedos, de lo contrario el
gesto fallar. Adems, trate tanto de los reconocedores gestos que hemos creado aqu:
52
Swipe Gesture Recognizer
Otra reconocedor gesto bastante comn es el golpe. Swiping se puede hacer hacia cualquiera de
las cuatro direcciones bsicas (derecha, izquierda, arriba, abajo), pero no en una forma diagonal.
La clase UISwipeGestureRecongnizer proporciona un mtodo que nos permite especificar la
direccin, y si no se establece, entonces la direccin correcta se utiliza por defecto. Un objeto
reconocedor gesto de golpe puede supervisar y motivar acciones de una sola direccin. Eso
significa que si quieres una vista en su aplicacin para apoyar a deslizar hacia dos o ms
direcciones, a continuacin, debe crear dos o ms objetos gesto reconocedor respectivamente.
Ms all de todo eso, tenga en cuenta que la accin que ha sido provocado por el movimiento de
golpe comienza justo despus de la birlar ha terminado (cuando el dedo en realidad deja de
deslizamiento).
En esta parte vamos a trabajar con la clase SwipeViewController que previamente hemos aadido
al proyecto. En la escena correspondiente en el Interface Builder, vamos a aadir tres visin
(UIView) objetos. La anchura de las tres vistas ser igual a la anchura de la pantalla. El primer
punto de vista se colocar en la pantalla, mientras que los otros dos puntos de vista sern
colocados en el lado derecho de la primera vista de la izquierda y, y, obviamente, estar fuera de
la zona visible. Nuestro objetivo es hacer que estas opiniones se mueven horizontalmente usando
gestos banda magntica, y dejar que las opiniones ocultas sean revelados deslizando hacia la
izquierda o derecha.
Main.storyboard. Ir a la escena del controlador de vista Swipe y aadir los prximos tres
subventanas definiendo al mismo tiempo las propiedades del marco y el color de fondo:
Primer View
Frame : X=0, Y=234, Width=320, Height=100
Background Color: R=215, G=116, B=52
Segundo View
Frame: X=320, Y=234, Width=320, Height=100
Background Color: Black Color
Third View
Frame: X=-320, Y=234, Width=320, Height=100
Background Color: R=0, G=128, B=0
53
A continuacin, cree las siguientes propiedades IBOutlet al archivo SwipeViewController.h:
@interface SwipeViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIView *viewOrange;
@property (weak, nonatomic) IBOutlet UIView *viewBlack;
@property (weak, nonatomic) IBOutlet UIView *viewGreen;
@end
Despus de haberlo hecho, volver a la escena del Swipe view controller, y hacer las conexiones
adecuadas. Obviamente, la propiedad viewOrange coincide con el primer punto de vista, la
propiedad viewBlack coincide con el segundo punto de vista, y la propiedad viewGreen coincide
con el tercer punto de vista.
Ahora, vamos a la cabeza en el fichero SwipeViewController.m, y vamos a empezar a crear el
reconocedor gesto que necesitamos uno por uno. Ir al mtodo viewDidLoad, e inicializar un
54
objeto, por primera vista (el que est en el medio de estar en el rea visible de la pantalla). Vamos
a ver que:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UISwipeGestureRecognizer *swipeRightOrange = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(slideToRightWithGestureRecognizer:)]; swipeRightOrange.direction = UISwipeGestureRecognizerDirectionRight; }
Lo que hemos hecho con este segmento es muy claro: A la inicializacin de objetos especificamos
el mtodo de accin que se debe llamar cuando ocurrir el birlar, y luego nos pusimos en la
direccin del gesto de deslizar hacia la derecha.
Ahora, vamos a crear una mayor gesto objeto reconocedor que nos permita deslizar hacia la
izquierda:
- (void)viewDidLoad { ... UISwipeGestureRecognizer *swipeLeftOrange = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(slideToLeftWithGestureRecognizer:)]; swipeLeftOrange.direction = UISwipeGestureRecognizerDirectionLeft; }
Ahora solo se aaden estos dos reconocedores gesto a la vista viewOrange exactamente como se
muestra a continuacin:
- (void)viewDidLoad { ... [self.viewOrange addGestureRecognizer:swipeRightOrange]; [self.viewOrange addGestureRecognizer:swipeLeftOrange]; }
55
Los mtodos de accin que se propusieron a los reconocedores de arriba, deben realizar una
accin simple: Para deslizar todos los puntos de vista, ya sea hacia la izquierda o hacia la derecha,
por lo que cuando una vista deja el rea visible de la pantalla, otro que se apareci. Vamos a
declarar a ellos primero y vamos a hacer la aplicacin siguiente. En la seccin de interfaz privada
aadir las siguientes lneas:
@interface SwipeViewController () -(void)slideToRightWithGestureRecognizer:(UISwipeGestureRecognizer *)gestureRecognizer; -(void)slideToLeftWithGestureRecognizer:(UISwipeGestureRecognizer *)gestureRecognizer; @end
Observaremos la aplicacin del primer mtodo de inmediato:
-(void)slideToRightWithGestureRecognizer:(UISwipeGestureRecognizer *)gestureRecognizer{ [UIView animateWithDuration:0.5 animations:^{ self.viewOrange.frame = CGRectOffset(self.viewOrange.frame, 320.0, 0.0); self.viewBlack.frame = CGRectOffset(self.viewBlack.frame, 320.0, 0.0); self.viewGreen.frame = CGRectOffset(self.viewGreen.frame, 320.0, 0.0); }]; }
Como se observa, cuando nos acercamos hacia la derecha, queremos que el punto de vista de
cada origen X a incrementarse en 320,0 pxeles y manejar de esa manera para mover nuestros
puntos de vista a la derecha. Hacemos este movimiento se vea natural simplemente envolviendo
todo en un bloque de animacin. Ntese tambin que la velocidad de movimiento depende de la
duracin de la animacin, as que si quieres un efecto ms lento diapositiva que debe aumentar la
duracin de la animacin, mientras que si los necesita para avanzar ms rpido, a continuacin,
slo disminuir la duracin.
El segundo mtodo de accin va a ser similar a este, con una diferencia solamente: El
desplazamiento en el eje X ser un nmero negativo (igual, por supuesto, a 320,0 pxeles), as que
las vistas se mueve hacia la izquierda. Veamos esta aplicacin, as:
-(void)slideToLeftWithGestureRecognizer:(UISwipeGestureRecognizer *)gestureRecognizer{ [UIView animateWithDuration:0.5 animations:^{
56
self.viewOrange.frame = CGRectOffset(self.viewOrange.frame, -320.0, 0.0); self.viewBlack.frame = CGRectOffset(self.viewBlack.frame, -320.0, 0.0); self.viewGreen.frame = CGRectOffset(self.viewGreen.frame, -320.0, 0.0); }]; }
Ejecutar la aplicacin una vez ms, y esta vez mostrar el contenido de la segunda pestaa. Deslice
el dedo hacia la derecha o hacia la izquierda, y ver los puntos de vista se deslizan dentro y fuera
usando una manera animada. Sin embargo, cuando una nueva vista aparece en pantalla, se
observara que ningn gesto de deslizar funciona ms. Esto sucede por el hecho de que no se ha
creado y aadido reconocedores gesto de golpe a los otros dos puntos de vista.
Volver al mtodo viewDidLoad, y empezar aadiendo el siguiente segmento:
- (void)viewDidLoad { ... UISwipeGestureRecognizer *swipeRightBlack = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(slideToRightWithGestureRecognizer:)]; swipeRightBlack.direction = UISwipeGestureRecognizerDirectionRight; [self.viewBlack addGestureRecognizer:swipeRightBlack]; }
Los mtodos de accin que se postulo a los reconocedores de arriba, deben realizar una cosa
simple: Para deslizar todos los puntos de vista, ya sea hacia la izquierda o hacia la derecha, por lo
que cuando una vista deja el rea visible de la pantalla, otro que se apareci. Vamos a declarar a
ellos primero y vamos a hacer la aplicacin siguiente. En la seccin de interfaz privada aadir las
siguientes lneas:
- (void)viewDidLoad { ... UISwipeGestureRecognizer *swipeLeftGreen = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(slideToLeftWithGestureRecognizer:)]; swipeLeftGreen.direction = UISwipeGestureRecognizerDirectionLeft; [self.viewGreen addGestureRecognizer:swipeLeftGreen]; }
57
58
59
Tenga en cuenta que por cada gesto de deslizar desea apoyarnos, debe crear un nuevo objeto
gesto reconocedor. Creacin de un solo objeto y agregarlo a ms de un punto de vista no se va a
trabajar. Si realmente quieres una prueba de ello, slo tiene que ir con el mtodo viewDidLoad y
aadir el swipeRightOrange y los reconocedores gesto swipeLeftOrange a las otras dos vistas
respectivamente. Ejecutar la aplicacin de nuevo, y luego pasar el dedo (o con el ratn en
simulador) al igual que antes. Por desgracia, esta vez no va a funcionar, as que ponga todo de
nuevo a su estado original.
Pan Gesture Recognizer
Este gesto es til cuando se desea permitir a sus usuarios arrastrar puntos de vista alrededor de la
pantalla. En esta parte, a excepcin de la aplicacin del cdigo necesario que permitir a nuestra
aplicacin para apoyar el gesto pan, nos encontraremos con un mtodo especial de la clase
60
UIPanGestureRecognizer, llamado velocityInView :. Este mtodo devuelve un valor CGPoint, y nos
informa sobre la cantidad de puntos por segundo la vista arrastrado viaja tanto en el eje horizontal
y vertical mientras arrastra. Esta informacin podra ser til en algunos casos, as que veremos
cmo acceder a ella.
Al igual que antes, vamos a empezar por la adicin de una vista de prueba para el Interface
Builder. Ir al archivo Main.storyboard, a continuacin, arrastre un objeto de vista (UIView) a la
escena del controlador de vista Pan. Establezca los siguientes dos atributos de la misma:
Frame : X=110, Y=234, Width=100, Height=100
Background Color: R=215, G=116, B=52 (o cualquier otro color)
A continuacin, vaya al archivo PanViewController.h y declarar una propiedad IBOutlet que usted
va despus de conectar a la vista:
@interface PanViewController : UIViewController @property (weak, nonatomic) IBOutlet UIView *testView; @end
Volver al archivo Main.storyboard y conecte la propiedad IBOutlet a la vista.
Una vez que haya terminado de trabajar con el Interface Builder, haga clic en el archivo
PanViewController.m en el Navegador de proyectos. El primer paso que debemos hacer, es crear
un gesto de reconocimiento de la cacerola y aadirlo a nuestra visin de prueba.A continuacin
vamos a ver es el siguiente:
- (void)viewDidLoad { ... UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveViewWithGestureRecognizer:)]; [self.testView addGestureRecognizer:panGestureRecognizer]; }
Ahora, declararemos e implementara el mtodo que establecimos como la accin que se debe
tomar cuando el gesto pan va a suceder. En la seccin de interfaz privada, aadir lo siguiente:
@interface PanViewController () -(void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureR
61
ecognizer; @end
Anteriormente, el objetivo es arrastrar la vista de prueba mientras movemos el dedo en la
pantalla. El enfoque ms fcil de que sera actualizar el punto de centro de la vista, siempre y
cuando se produce la panoramizacin.La traduccin de este cdigo es la siguiente:
-(void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer{ CGPoint touchLocation = [panGestureRecognizer locationInView:self.view]; self.testView.center = touchLocation; }
Cada gesto reconocedor contiene un mtodo llamado locationInView. Este mtodo devuelve un
valor CGPoint que representa el punto de la opinin de que el usuario afectado. En nuestro caso,
llamando a este mtodo logramos obtener el punto tocado durante el arrastre, y para que nuestra
aplicacin consciente del movimiento del dedo. Por lo tanto, lo que slo necesitamos es establecer
esa ubicacin tctil como el valor para el punto central de la vista de la prueba, y eso es
exactamente realizo utilizando el segundo comando anterior.
Ejecutar la aplicacin ahora y coloque el dedo o el puntero del ratn en la vista de prue ba. Luego
empiece a arrastrar alrededor y observe cmo la vista sigue el movimiento que realice.
62
El enfoque que present anteriormente es simple para el bien del tutorial. En una aplicacin real,
es posible que desee enriquecer el movimiento de la vista mediante la adicin de aceleracin o
deceleracin cuando empieza o deja arrastrar, o cualquier otra cosa que usted necesita. Todo
depende de usted para aplicar la lgica propia en el mtodo de accin a implementar.
Al comienzo de esta seccin, he dicho que no es un mtodo especial de la clase
UIPanGestureRecognizer llamado velocityInView. Hasta este punto hemos totalmente ignorado,
pero ahora vamos a ver cmo podemos acceder a ella y obtener los datos que proporciona. En
aras de la demo, vuelva a la Interface Builder, haga clic en el archivo Main.storyboard. Localice la
escena controlador de vista Pan, y aadir dos etiquetas con los siguientes atributos:
Label #1
63
Frame: X=20, Y=445, Width=280, Height=21
Text: Nothing (vacio)
Font size: 14pt
L