2013-12-10 16 views
10

Su Mac OS X, facendo un tocco con tre dita su una parola si apre una finestra con una definizione della parola.Come posso ignorare il comportamento del tocco a 3 dita in un NSTextView?

Image showing a pop up window showing a word definition.

Questo idioma è utilizzato anche in Xcode, dove fare un rubinetto a 3 dita su un simbolo mostra la sua documentazione, proprio come se fosse stato alt + clic.

Image showing a pop up window showing symbol documentation.

mi piacerebbe fare qualcosa di simile a quello e definizioni di visualizzazione quando gli utenti della mia applicazione fanno un rubinetto a 3 dita su alcuni gettoni in un NSTextView. Tuttavia, non riesco a trovare come rilevare che un tocco è stato fatto con 3 dita. Qualcuno potrebbe aiutarmi con quello?

EDIT Se questo ricorda niente a nessuno, tre eventi (pescato sovrascrivendo [NSApplication sendEvent:]) vengono attivati ​​quando si esegue questo tipo di rubinetto:

NSEvent: type=SysDefined loc=(270.918,250.488) time=417954.6 flags=0x100 win=0x0 winNum=28293 ctxt=0x0 subtype=6 data1=1818981744 data2=1818981744 
NSEvent: type=SysDefined loc=(270.918,250.488) time=417954.6 flags=0x100 win=0x0 winNum=28293 ctxt=0x0 subtype=9 data1=1818981744 data2=1818981744 
NSEvent: type=Kitdefined loc=(0,263) time=417954.8 flags=0x100 win=0x0 winNum=28306 ctxt=0x0 subtype=4 data1=1135411200 data2=1132691456 

risposta

7

Reagendo su una tripla rubinetto in un NSTextView può essere più fatto facilmente sovrascrivendo quickLookWithEvent:.

-(void)quickLookWithEvent:(NSEvent *)event 
{ 
    NSLog(@"Look at me! %@", event); 
} 

Mi ha anche insegnato che è possibile triplo toccare qualsiasi cosa per richiamare Quick Look su di esso.

+0

alcuni mesi tardi @zneak, ma 'quickLookWithEvent:' è documentato come [essendo in 'NSResponder' a partire da 10.8] (https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes /NSResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/NSResponder/quickLookWithEvent :) – andlabs

+0

Oh, dolce. Immagino che mi sia appena mancato. – zneak

2

sottoclasse NSTextView e sovrascrivere mouse evento (questo è dove la vista di solito gestisce gli eventi click/tap):

-(void)mouseDown:(NSEvent*)event 
{ 
    if (event.clickCount == 3) 
    { 
    //Do your thing 
    } 
} 

Spero che questo aiuti.

Se il triplo clic non funziona per voi (non sono al corrente dal mio Mac per controllare), potete provare qualcos'altro. So che funziona su iOS, non conosco i gesti del trackpad.

Si potrebbe provare ad aggiungere un UITapGestureRecognizer alla vista:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTapped:)]; 
tapGesture.numberOfTouchesRequired = 3; 

//.... 

-(void)viewTapped:(UITapGestureRecognizer*)tap 
{ 
    if(tap.state == UIGestureRecognizerStateRecognized) 
    { 
    //you detected a three finger tap, do work 
    } 
} 

modificare in seguito:

ho trovato this article nella documentazione di Apple. Sulla base di un campione da questo articolo, ecco un po 'di codice che dovrebbe essere utile (dalla quotazione 8-5):

- (void)touchesBeganWithEvent:(NSEvent *)event { 
    if (!self.isEnabled) return; 

    NSSet *touches = [event touchesMatchingPhase:NSTouchPhaseTouching inView:self.view]; 

    if (touches.count == 3) 
    { 
     //Three finger touch detected 
    } 

    [super touchesBeganWithEvent:event]; 
} 
+0

L'esempio 'mouseDown:' funziona per eseguire 3 tocchi successivi ma non rileva i tocchi fatti con 3 dita. – zneak

+0

@zneak Ho capito che è piuttosto veloce, quindi ho aggiunto la seconda parte. Penso davvero che possa portare a una soluzione al tuo problema, se fosse disponibile per il trackpad, che nel frattempo ho trovato che non lo è. Tuttavia, ho trovato qualcosa nella documentazione di Apple che sto modificando nella mia risposta. – nestedloop

Problemi correlati