objective-c - problemas - mi primera aplicacion ios xcode
Escucha todos los eventos táctiles en una aplicación iOS (5)
Cree una "aplicación VA" de clase que se extienda desde la aplicación UIA y pegue estos códigos en la clase correspondiente
VApplication.h
#import <Foundation/Foundation.h>
// # of minutes before application times out
#define kApplicationTimeoutInMinutes 10
// Notification that gets sent when the timeout occurs
#define kApplicationDidTimeoutNotification @"ApplicationDidTimeout"
/**
* This is a subclass of UIApplication with the sendEvent: method
* overridden in order to catch all touch events.
*/
@interface VApplication : UIApplication
{
NSTimer *_idleTimer;
}
/**
* Resets the idle timer to its initial state. This method gets called
* every time there is a touch on the screen. It should also be called
* when the user correctly enters their pin to access the application.
*/
- (void)resetIdleTimer;
@end
VApplication.m
#import "VApplication.h"
#import "AppDelegate.h"
@implementation VApplication
- (void)sendEvent:(UIEvent *)event
{
[super sendEvent:event];
// Fire up the timer upon first event
if(!_idleTimer) {
[self resetIdleTimer];
}
// Check to see if there was a touch event
NSSet *allTouches = [event allTouches];
if ([allTouches count] > 0)
{
UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase;
if (phase == UITouchPhaseBegan)
{
[self resetIdleTimer];
}
}
}
- (void)resetIdleTimer
{
if (_idleTimer)
{
[_idleTimer invalidate];
}
// Schedule a timer to fire in kApplicationTimeoutInMinutes * 60
// int timeout = [AppDelegate getInstance].m_iInactivityTime;
int timeout = 3;
_idleTimer = [NSTimer scheduledTimerWithTimeInterval:timeout
target:self
selector:@selector(idleTimerExceeded)
userInfo:nil
repeats:NO];
}
- (void)idleTimerExceeded
{
/* Post a notification so anyone who subscribes to it can be notified when
* the application times out */
[[NSNotificationCenter defaultCenter]
postNotificationName:kApplicationDidTimeoutNotification object:nil];
}
@end
Reemplace el nombre de la clase "VApplication" por nuestro
Main.m
archivo como este
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, @"VApplication", NSStringFromClass([AppDelegate class]));
}
}
Registre una notificación para su controlador de vista correspondiente
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidTimeout:) name:kApplicationDidTimeoutNotification object:nil];
Y una vez que se agote el tiempo de espera, la notificación se activará y manejará el evento de esta manera
- (void) applicationDidTimeout:(NSNotification *) notif //inactivity lead to any progress
{
}
¿Es posible de alguna manera escuchar y capturar todos los eventos táctiles que ocurren en una aplicación?
La aplicación que estoy desarrollando actualmente se utilizará en salas de exposición y quioscos de información y, por lo tanto, me gustaría volver a la sección de inicio de la aplicación si no se han recibido toques durante un par de minutos. Una especie de funcionalidad de salvapantallas, por así decirlo. Estoy planeando implementar esto al tener un temporizador en segundo plano, que se debe restablecer y reiniciar cada vez que ocurra un evento táctil en algún lugar de la aplicación. ¿Pero cómo puedo escuchar los eventos táctiles? ¿Alguna idea o sugerencia?
Es muy facil
Necesita una subclase de UIApplication
(llamémosla MyApplication
).
Modificas tu main.m
para usarlo:
return UIApplicationMain(argc, argv, @"MyApplication", @"MyApplicationDelegate");
Y anula el método [MyApplication sendEvent:]
:
- (void)sendEvent:(UIEvent*)event {
//handle the event (you will probably just reset a timer)
[super sendEvent:event];
}
Podría colocar una vista transparente en la parte superior de la jerarquía de vistas y elegir en esa vista si controlar los eventos táctiles que recibe o pasarlos a vistas inferiores.
Puede utilizar un reconocedor de gestos de toque para esto. Subclase UITapGestureRecognizer
e importe <UIKit/UIGestureRecognizerSubclass.h>
. Esto define touchesBegan:
touchesMoved:
touchesEnded:
y touchesCancelled:
Ponga su código de manejo táctil en los métodos apropiados.
Instale el reconocedor de gestos en la application:didFinishLaunchingWithOptions:
y agréguelo a UIWindow
. Establezca cancelsTouchesInView
en NO
y pasará todos los toques de forma transparente.
Crédito: esta publicación .
Se podría usar una subclase de UIWindow
para hacer esto, anulando hitTest:
Luego, en el XIB de su ventana principal, generalmente hay un objeto llamado simplemente Window
. Haga clic en eso, luego a la derecha en el panel Utilidades, vaya a Identidades (Alt-Comando-3). En el campo de texto Clase , ingrese el nombre de su subclase UIWindow
.
MyWindow.h
@interface MyWindow : UIWindow
@end
MyWindow.m
@implementation MyWindow
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *res;
res = [super hitTest:point withEvent:event];
// Setup/reset your timer or whatever your want to do.
// This method will be called for every touch down,
// but not for subsequent events like swiping/dragging.
// Still, might be good enough if you want to measure
// in minutes.
return res;
}
@end