2009-05-09 24 views
13

In uno dei miei progetti iPhone, ho tre visualizzazioni che è possibile spostare toccando e trascinando. Tuttavia, voglio impedire all'utente di spostare due viste contemporaneamente, usando due dita. Ho quindi provato a sperimentare con UIView.exclusiveTouch, senza alcun successo.Perché UIView.exclusiveTouch non funziona?

Per capire come le opere di proprietà, ho creato un nuovo progetto, con il seguente codice nel controller della 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); 
} 

Quando si esegue questa, hej: viene chiamato, con diversi mittenti, quando si preme qualsiasi dei pulsanti - anche se uno di essi ha esclusivoTouch impostato su SÌ. Ho provato a commentare le linee multipleTouchEnabled, senza alcun risultato. Qualcuno può spiegarmi cosa mi manca qui?

Grazie, Eli

risposta

18

Da The iPhone OS Programming Guide:

Limitare la consegna degli eventi ad un unico punto di vista:

Per impostazione predefinita, la proprietà exclusiveTouch di vista è impostata su NO. Se si imposta la proprietà su SÌ, si contrassegna la vista in modo che, se sta eseguendo il rintracciamento dei tocchi , è l'unica visualizzazione nella finestra a cui tocchi il rilevamento. Altre visualizzazioni nella finestra non possono ricevere quei tocchi. Tuttavia, una vista contrassegnata come "tocco esclusivo" non riceve tocchi che sono associati ad altre viste nella stessa finestra. Se un dito contatta una visualizzazione con tocco esclusivo, quel tocco viene consegnato solo se quella vista è l'unica vista che tiene traccia di un dito in quella finestra. Se un dito tocca una vista non esclusiva, quel tocco viene consegnato solo se non c'è un altro tracciamento del dito in una visualizzazione con tocco esclusivo.

Si afferma che la proprietà di tocco esclusivo NON influenza i tocchi all'esterno della cornice della vista.

Per gestire questo aspetto in passato, utilizzo la vista principale per tenere traccia di TUTTI I TOUCHES sullo schermo invece di lasciare che ogni traccia subview tocchi. Il modo migliore è quello di fare:

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

@Bradlarson ho aggiornato l'OP con il collegamento corrente alla documentazione, vi sono i benvenuti :) –

+0

@ RichardJ.RossIII - Ecco dove che è andato. Stavo cercando dove hanno messo la documentazione di gestione degli eventi l'altro giorno. Grazie. –

+0

Non credo che la tua interpretazione sia ciò che dice il doc. Secondo il doc, penso che il codice di @ eliego dovrebbe funzionare come previsto. In caso contrario, si tratta di un bug di UIKit o del documento. – an0