2012-04-27 10 views
10

que tienen sólo un UITableView regular, y que corrió este código:¿Qué es un UIGobblerGestureRecognizer?

UITableView *tableView = [[UITableView alloc] init]; 
for(UIGestureRecognizer *gesture in tableView.gestureRecognizers) 
{ 
    NSString *className = NSStringFromClass([gesture class]); 
    NSLog(@"ClassName:%@", className); 
} 

Una de las líneas de salida es: ClassName:UIGobblerGestureRecognizer

Sorprendentemente Google no tiene nada en esto. Alguien tiene alguna idea de lo que es?

+0

¡Jaja, nombre de clase divertido! ¿Tal vez sea por golpes frenéticos? – Costique

+4

Bueno, dado que no es API pública, mi sugerencia sería "no importa, y puedes ignorarla" :) –

+0

Jaja Quiero decir si fuera solo un nombre de clase típico, lo ignoraría, pero un ' Gobbler' - ¡Quiero saber qué hace eso! – Snowman

Respuesta

7

Es muy probable que se trate de una clase interna que Apple usa. Me he encontrado con subclases personalizadas de UIGestureRecognizers que Apple creó para un uso específico. Estoy seguro de que han necesitado crear reconocedores de gestos personalizados por varias razones, al igual que yo y no todas esas clases están expuestas para que las utilicemos.

1

que sin duda debe ser parte de la API privada ..

voy a sugerir a permanecer fuera de ella

2

Salida http://oleb.net/blog/2013/02/new-undocumented-apis-ios-6-1/

BJ Homer cree UIGobblerGestureRecognizer se utiliza para evitar el reconocimiento, mientras que las animaciones están en progreso. De lo contrario, es inactivo. En una interesante conversación de Twitter, Filippo Bigarella y Conrad Kramer descubrieron que UIGobblerGestureRecognizer puede "engullir" toques para evitar que otros reconocedores de gestos de los reciban en determinadas situaciones. En qué situaciones se encuentran, I no sé.

2

Estoy seguro de que se usa para evitar la interacción normal mientras una celda en particular muestra un botón de confirmación de eliminación y reconoce cualquier toque como activación de esa celda para volver a un estado sin edición.

Tiene este método y supongo que excludedView es la celda que muestra un botón de confirmación de eliminación, ya que normalmente todavía puede interactuar con celdas en este estado.

- (id)initWithTarget:(id)arg1 action:(SEL)arg2 excludedView:(id)arg3;

https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UIGobblerGestureRecognizer.h

2

En resumen, por lo que he leído y lo que mis experimentos han demostrado, el "pavo" parece engullir a los golpes y toques en una vista de tabla (en realidad celdas de la tabla) cuando una transición de estado (iniciada por el toque o deslizamiento del usuario) está en progreso, de modo que la transición de estado puede completarse antes de que el usuario pueda tocar la mesa nuevamente. Apple puede usarlo en otros casos, pero es en la vista de tabla que he observado a los gorriones.

Ahora la larga historia: supongamos que su vista de tabla implementa un "cajón" en la celda de la tabla, como la aplicación de correo o la aplicación de mensajes de Apple. Cuando abre el cajón con un deslizamiento hacia atrás y realiza una acción en cualquiera de los botones del cajón, todo está bien. Pero si cierra el sorteo con un segundo golpe, es probable que su próximo deslizamiento hacia atrás en una celda aleatoria no funcione. Pero si continúa haciendo los movimientos hacia atrás, el siguiente golpe normalmente funcionará nuevamente para mostrar el cajón. En pocas palabras, si solo abre y cierra el cajón en celdas aleatorias mediante el uso de deslizamientos, a veces encontrará que el cajón no se abre.

Veo este comportamiento en mi mesa y pensé que había hecho algo mal. Intenté muchas cosas y eventualmente implementé mi propia subclase de UITableView que también admite UIGestureRecognizerDelegate.En mi subclase, implementé la función shouldBeRequiredToFailByGestureRecognizer del delegado, solo para imprimir los pares gestureRecognizer y otherGestureRecognizer. Luego descubrí que cuando se reconoce el deslizamiento hacia atrás, el gobbler NO está presente en los pares. Pero cuando el deslizamiento hacia atrás no está funcionando, definitivamente el gorgojo ESTÁ presente.

La opinión general en la web es que el gobbler se usa para evitar que el usuario cause otra transición de estado en la tabla mientras una transición ya está en progreso. Eso está bien si el usuario realmente realiza alguna acción (tocando un botón en el cajón). Pero cuando el usuario simplemente cierra el cajón, se debe cancelar el gobbler. O el gobbler se debe agregar SÓLO cuando el usuario realiza una acción. Después de mi realización, pasé a probar mi teoría sobre las aplicaciones de Apple. Ya sabía que la aplicación de correo se comporta perfectamente respondiendo a cada golpe. Pero la aplicación de mensajes se comporta de forma intermitente a toques de apertura de cajón repetidos, al igual que mi aplicación. Así que supongo que los desarrolladores de Mail son más cuidadosos y usaron el conocimiento interno para hacerlo bien. Mi observación se hace en iOS 8.4 en iPhone 6 y iPad 2. Y creo que el mismo problema se remonta al menos desde el primer lanzamiento de iOS 8 porque sé que mi aplicación tuvo el problema desde el primer día (hace meses), pero acabo de recibirlo. alrededor para ver el problema.