2009-05-09 17 views
13

En uno de mis proyectos de iPhone, tengo tres vistas que puede mover tocando y arrastrando. Sin embargo, quiero evitar que el usuario mueva dos vistas al mismo tiempo, usando dos dedos. Por lo tanto, he intentado experimentar con UIView.exclusiveTouch, sin éxito.¿Por qué no funciona UIView.exclusiveTouch?

Para entender cómo funciona la propiedad, he creado un nuevo proyecto, con el código siguiente en el controlador de vista:

- (void)loadView { 

    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)]; 
    UIButton* a = [UIButton buttonWithType:UIButtonTypeInfoDark]; 
    [a addTarget:self action:@selector(hej:) forControlEvents:UIControlEventTouchUpInside]; 
    a.center = CGPointMake(50, 50); 
    a.multipleTouchEnabled = YES; 

    UIButton* b = [UIButton buttonWithType:UIButtonTypeInfoDark]; 
    [b addTarget:self action:@selector(hej:) forControlEvents:UIControlEventTouchUpInside]; 
    b.center = CGPointMake(200, 50); 
    b.multipleTouchEnabled = YES; 

    a.exclusiveTouch = YES; 

    [self.view addSubview:a]; 
    [self.view addSubview:b]; 

} 

- (void)hej:(id)sender 
{ 
    NSLog(@"hej: %@", sender); 
} 

Cuando se ejecuta esto, hej: se vuelve a llamar, con diferentes remitentes, al pulsar cualquier de los botones, a pesar de que uno de ellos tiene exclusiveTouch configurado en SÍ. Intenté comentar los múltiplesTouchEnabled-lines, en vano. ¿Puede alguien explicarme qué me falta aquí?

Gracias, Eli

Respuesta

18

De The iPhone OS Programming Guide:

La restricción de entrega de eventos a un único punto de vista:

De manera predeterminada, una vista de la propiedad exclusiveTouch está en NO. Si establece la propiedad en SÍ, marque la vista para que, si está siguiendo toques, sea la única vista en la ventana que esté siguiendo toques. Otras vistas en la ventana no pueden recibir esos toques. Sin embargo, una vista que está marcada como "toque exclusivo" no recibe toques que están asociados con otras vistas en la misma ventana. Si un dedo contacta con una vista de toque exclusivo, ese toque solo se entrega si esa vista es la única vista que rastrea un dedo en esa ventana. Si un dedo toca una vista no exclusiva, ese toque solo se entrega si no hay otro seguimiento del dedo en una vista táctil exclusiva.

Establece que la propiedad táctil exclusiva NO afecta los toques fuera del marco de la vista.

Para manejar esto en el pasado, utilizo la vista principal para rastrear TODOS LOS TOUCHES en la pantalla en lugar de dejar que cada pista de la subvista toque. La mejor manera es hacer:

if(CGRectContainsPoint(thesubviewIcareAbout.frame, theLocationOfTheTouch)){ 
    //the subview has been touched, do what you want 
} 
+0

@Bradlarson Me ha actualizado la OP con el enlace actual de la documentación, que son bienvenidos :) –

+0

@ RichardJ.RossIII - así que de ahí que se fue. Estaba buscando dónde colocaron la documentación de manejo del evento el otro día. Gracias. –

+0

No creo que su interpretación sea lo que dice el documento. De acuerdo con el documento, creo que el código de @ eliego debería funcionar como esperaba. Si no, es un error de UIKit o del documento. – an0

Cuestiones relacionadas