¿Cómo puedo simular un gesto de deslizamiento mediante progtwigción?

Actualmente estoy tratando de escribir algunas testings de aceptación para nuestra nueva aplicación de iOS usando frank (y, a la vez, UISpec ). Aunque el marco admite los toques como una forma básica de interactuar con las vistas, actualmente no admite gestos más complicados (p. Ej., Pellizcar, deslizar, etc.). Necesito agregar soporte para deslizar al less porque esto es fundamental para la funcionalidad de nuestra aplicación y nuestras testings serán bastante inútiles sin ella.

Implementar esto debería ser bastante sencillo si puedo encontrar una manera de simular los events en Cocoa. Es posible enviar gestos de deslizar si utiliza el marco de UIAutomation de Apple ( ver aquí ), por lo que hay un ejemplo de algo que genera estos events de forma externa. He buscado en la networking, pero no he encontrado ningún ejemplo de personas que hagan esto (aunque había un hilo donde alguien estaba pidiendo algo similar a esto antes …).

Muchas gracias de antemano por su ayuda / ideas …

    Pasé ayer intentando que esto funcione, terminó en una especie de solución. No estoy del todo contento con esto, pero fue lo mejor que pude hacer por ahora: si alguien puede sugerir alguna mejora o una alternativa de trabajo, les daría la bienvenida …

    De todos modos, para cualquier otra persona que intente hacer algo similar. Basé mi solución en la API detallada en esta publicación : grabé la secuencia de events que quería simular y luego volví a reproducirlos. El único inconveniente es que no pude conseguir que la API de reproducción incorporada funcione (obtuve el mismo error mencionado en los comentarios mencionados en la parte inferior). Después de un time buscando en la tierra de ASM, terminé escribiendo mi propia versión.

    @implementation UIApplication (EventReplay) /// /// - replayEventsFromFile: /// - (void)replayEventsFromFile:(NSString *)filename { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:filename]; NSArray* eventList = [[NSArray arrayWithContentsOfFile:filePath] retain]; [self replayEvents:eventList]; } /// /// - replayEvents: /// - (void)replayEvents:(NSArray *)events { if (!events.count) return; NSDictionary *eventDict = [events objectAtIndex:0U]; GSEventRef thisEvent = GSEventCreateWithPlist((CFDictionaryRef)eventDict); uint64_t eventTime = thisEvent->record.timestamp; thisEvent->record.timestamp = mach_absolute_time(); mach_port_t appPort = GSCopyPurpleNamedPort([[[NSBundle mainBundle] bundleIdentifier] UTF8String]); GSSendEvent(&thisEvent->record, appPort); mach_port_deallocate(mach_task_self(), appPort); if (events.count <= 1) return; NSIndexSet *remainderIndexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, events.count - 1)]; NSArray *remainingEvents = [events objectsAtIndexes:remainderIndexes]; GSEventRef nextEvent = GSEventCreateWithPlist((CFDictionaryRef)[remainingEvents objectAtIndex:0U]); NSTimeInterval nextEventDelay = GetTimeDelta(nextEvent->record.timestamp, eventTime); if (nextEventDelay > 0.05) [self performSelector:@selector(replayEvents:) withObject:remainingEvents afterDelay:nextEventDelay]; else [self replayEvents:remainingEvents]; CFRelease(nextEvent); CFRelease(thisEvent); } @end 

    El fragment de arriba muestra cómo estoy reproduciendo los events. Mi implementación es bastante crujiente, verás que tuve que cambiar el hecho de que si uso ciegamente un timer para progtwigr el siguiente evento, a veces no se dispara, parece ser cuando la demora es demasiado pequeña. El horrible truco que ves parece hacer que las cosas funcionen bien.

    De todos modos, espero que esto ayude a otra persona de alguna manera.