Академический Документы
Профессиональный Документы
Культура Документы
iOS
Introduccin
El objetivo de esta gua es analizar mediante un ejemplo concreto las posibilidades que ofrece iOS para reaccionar a la interaccin del usuario, en particular frente al uso de gestos como arrastrar, pellizcar, tocar, rotar, etc. La misma es una versin adaptada y reducida de un muy buen artculo de Ray Wanderlich disponible en la web (http://www.raywenderlich.com/6567/uigesturerecognizer- tutorial-in-ios-5-pinches-pans-and-more)
Proyecto
y
recursos
Vamos
comenzar
nuestra
gua
creando
una
aplicacin
del
tipo
Single
View
Application:
Luego agregaremos unas imgenes que utilizaremos en un rato al proyecto, arrastrndolas sobre la carpeta Gua de Gastos:
iOS
Vista
Abrimos
la
storyboard
y
agregamos
tres
Image
View.
A
cada
una
le
estableceremos
como
imagen
una
de
las
imgenes
agregadas
en
el
paso
anterior,
y
a
todas
les
daremos
el
tamao
justo
para
mostrar
las
imgenes.
Para
esto
seleccionaremos
cada
una
y
utilizaremos
la
opcin
del
men
Editor\Size
To
Fit
Content.
Nuestra
vista
debera
quedar
ms
o
menos
as:
iOS
Para estar seguros de que lo hicimos bien mirando el Connections Inspector para la imagen:
Como ya tenemos el Gesture Recognizer y lo asociamos a la imagen, el siguiente paso ser escribir el mtodo que este utilizar como callback para avisarnos de los cambios. En el archivo DMViewController.h agregaremos la siguiente definicin:
iOS
y en DMViewController.m su implementacin:
Este mtodo se ejecutar cuando el Gesture Recognizer detecte que se comienza a arrastrar un objeto, y continuar invocndose una y otra vez mientras se siga arrastrando. Podemos obtener cuanto es que el usuario a movido su dedo mediante el mtodo translationInView. Luego accedemos al objeto que est siendo arrastrado mediante la propiedad view del recognizer, y le cambiamos su centro al que tena ms la cantidad que el usuario haya movido el dedo. Esto logra el efecto de arrastre. Finalmente la ltima lnea del mtodo resetea la cantidad de arrastre (translation), de otra manera seguiremos acumulando la cantidad, cuando ya no es necesario porque movimos el objeto. Ya tenemos el recognizer y el mtodo que actuar como callback, solo nos falta relacionarlos. Para ello simplemente arrastraremos desde el Connections Inspector del recognizer la accin selector hacia el View Controller. Cuando soltemos el botn del mouse nos preguntar que mtodo queremos asociar, a lo que seleccionaremos handlePan.
Ya tenemos todo pronto, solo nos falta habilitar la interaccin con el usuario para el ImageView, lo que por defecto est desactivado. Seleccionaremos la primera imagen y en el Attributes Inspector habilitaremos la opcin User Interaction Enabled:
iOS
Ya podemos probar la aplicacin para ver si responde al arrastre sobre la primera imagen (recordar que solo asociamos esta con el Gesture Recognizer). Si seguimos todos los pasos correctamente deberamos poder arrastrar la imagen a lo largo de la pantalla. Para completar el ejemplo vamos a agregar otros dos Pan Gesture Recognizer, arrastrando cada uno a cada una de las otras dos imgenes. Vamos a tener un recognizer para cada imagen. Luego de agregarlos vamos a unir la accin selector desde el Connection Inspector con el View Controller, seleccionando el mtodo handlePan, como hicimos con el primer recognizer. Resumiendo, cada imagen tendr su propio recognizer, pero los tres utilizarn el mismo mtodo de callback.
Desaceleracin
Es
comn
que
los
controles
en
iOS
muestren
un
efecto
de
desaceleracin
cuando
se
termina
de
moverlos,
por
ejemplo
cuando
hacemos
scroll
sobre
una
lista
o
una
vista
web.
Con
muy
poco
esfuerzo
vamos
a
agregar
este
efecto
mediante
una
de
varias
formas
posibles
en
nuestra
aplicacin.
La
idea
ser
detectar
cuando
el
gesto
termina,
calcular
que
tan
rpido
era
el
arrastre
y
animar
el
objeto
que
se
mueve
hasta
su
posicin
final
desacelerando
la
velocidad.
Para
lograrlo
vamos
a
modificar
el
mtodo
handlePan
que
ya
escribimos,
preguntndole
al
recognizer
en
que
estado
est
el
gesto
(iniciando,
cambiando
o
terminando).
Esto
lo
lograremos
simplemente
accediendo
a
su
propiedad
state.
Para
conocer
la
velocidad
llamaremos
al
mtodo
velocityInView.
Para
implementar
estos
cambios
agregaremos
el
siguiente
cdigo
al
final
de
la
implementacin
actual
de
handlePan
(nota:
es
posible
copiar
y
pegar):
if (recognizer.state == UIGestureRecognizerStateEnded) { CGPoint velocity = [recognizer velocityInView:self.view]; CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y)); CGFloat slideMult = magnitude / 200; float slideFactor = 0.1 * slideMult; CGPoint finalPoint = CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor), recognizer.view.center.y + (velocity.y * slideFactor)); finalPoint.x = MIN(MAX(finalPoint.x, 0), self.view.bounds.size.width); finalPoint.y = MIN(MAX(finalPoint.y, 0), self.view.bounds.size.height); [UIView animateWithDuration:slideFactor*2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ recognizer.view.center = finalPoint; } completion:nil]; }
iOS
Pellizcos
y
Rotaciones
Para
detectar
pellizcos
y
rotaciones
debemos
seguir
la
misma
mecnica
de
uso
de
los
gesture
recognizers.
Esta
vez
comenzaremos
escribiendo
los
mtodos
de
callback
en
el
view
controller.
En
DMViewController.h
agregaremos:
y en la implementacin (DMViewController.m):
Ahora simplemente debemos agregar un UIPinchGestureRecogizer y un UIRotationGestureRecognizer sobre cada imagen. Luego de esto debemos asociar sus selecciones con el view controller, seleccionando en cada caso el mtodo que corresponda. Una vez agregados los recognizers y enlazados con sus mtodos de callback podemos volver a probar la aplicacin. Para simular el pinch o la rotacin en el simulador se puede presionar la tecla option al hacer click en el mouse, lo que har aparecer dos crculos que simulan los puntos de contacto de los dedos del usuario con la pantalla del telfono. 6
iOS
Resumen
Esta
gua
presenta
algunos
conceptos
bsicos
relacionados
con
la
captura
de
gestos
en
iOs.
Como
se
menciona
al
principio,
la
misma
es
una
versin
reducida
y
adaptada
de
un
muy
buen
artculo
de
Ray
Wenderlich
publicado
aqu:
http://www.raywenderlich.com/6567/uigesturerecognizer-tutorial- in-ios-5-pinches-pans-and-more
El
artculo
es
bastante
ms
extenso
que
la
gua,
y
toca
otros
puntos
interesantes
como
el
tratamiento
simultaneo
de
varios
Gesture
Recognizers,
su
utilizacin
mediante
cdigo
(sin
usar
Interface
Builder
como
en
la
gua)
e
incluso
la
creacin
de
reconocedores
personalizados.
Se
recomienda
ampliamente
la
lectura
del
mismo.