2011-09-15 11 views
7

Sto scrivendo un'applicazione che utilizza OS X Lion e Snow Leopard. Sono d'accordo sul fatto che voglio rispondere agli eventi di scorrimento. La mia comprensione è che i colpi a tre dita chiameranno -[NSResponder swipeWithEvent:] se tale metodo è implementato nella mia visualizzazione personalizzata. Ho già guardato this di domande e relative risposte, e ha cercato la seguente implementazione stub modificata del codice di Oscar Del Ben:- [NSResponder swipeWithEvent:] non chiamato

@implementation TestView 

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code here. 
    } 

    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    [[NSColor redColor] set]; 
    NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver); 
} 

- (void)swipeWithEvent:(NSEvent *)event { 
    NSLog(@"Swipe event detected!"); 
} 

- (void)beginGestureWithEvent:(NSEvent *)event { 
    NSLog(@"Gesture detected!"); 
} 

- (void)endGestureWithEvent:(NSEvent *)event { 
    NSLog(@"Gesture end detected!"); 
} 

- (void)mouseDown:(NSEvent *)theEvent { 
    NSLog(@"mouseDown event detected!"); 
} 

@end 

Questo compila e funziona bene, e la vista rende come previsto. L'evento mouseDown: è registrato correttamente. Tuttavia, nessuno degli altri eventi viene attivato. Né i metodi begin/endGestureWithEvent: né il metodo swipeWithEvent:. Il che mi fa meravigliare: devo impostare un progetto/applicazione in qualche punto per ricevere e/o interpretare correttamente i gesti? Grazie in anticipo per l'aiuto.

+0

Come nota a margine, è possibile ottenere lo scorrimento gesti da' - [NSResponder scrollwheel:] ', ma questo ho voluto usare per specificamente gesti a tre dita – nomothetis

risposta

9

Per ricevere i messaggi swipeWithEvent:, è necessario assicurarsi che il gesto di scorrimento a 3 dita non sia mappato su alcunché possa causare un conflitto. Vai a Preferenze di Sistema -> Trackpad -> più gesti, e impostare le preferenze per una delle seguenti opzioni:

  • Swipe tra le pagine:

    1. Swipe con due o tre dita, o
    2. Sfiora con tre dita

  • Swipe tra applicazioni a schermo intero:

    1. Scorri verso sinistra o verso destra con quattro dita

In particolare, il colpo tra le applicazioni a schermo intero, non deve essere impostato su tre dita , altrimenti non riceverai i messaggi swipeWithEvent:.

Insieme, queste due impostazioni delle preferenze causano i messaggi swipeWithEvent: da inviare al primo risponditore.

Ovviamente, è ancora necessario implementare la logica di scorrimento effettiva. E se vuoi eseguire un scroll-swipe fluido su iOS, allora dovrai fare un po 'più di lavoro. C'è un esempio di come farlo nelle note sulla versione del kit di app Lion sotto la sezione "Fluid Swipe Tracking."

Vedi http://developer.apple.com/library/mac/#releasenotes/Cocoa/AppKit.html

+0

Ci scusiamo per aver impiegato molto a rispondere; Ho pensato che SO mi avrebbe mandato delle e-mail quando qualcuno ha risposto. Io uso BetterTouchTool, quindi è molto probabile che questa sia la ragione per cui le cose non hanno funzionato come avrei voluto. Darei un'occhiata a questo; nel frattempo, penso che questa risposta fornisca le informazioni necessarie, quindi la sto taggando come corretta. – nomothetis

0

La tua opinione accetta i primi soccorritori?

- (BOOL) acceptsFirstResponder 
{ 
    return YES; 
} 
+0

Suppongo che tu intendessi '- (BOOL) acceptFirstResponder'; Non ce l'ho, ma l'ho appena provato e non ha funzionato – nomothetis

+0

Sì, ho modificato la risposta. stai scorrendo le dita sopra la tua vista? –

+0

Sì; ho implementato altre funzionalità che rispondono al gesto di scorrimento e funziona come previsto, così come il 'mouseUp : 'callback. – nomothetis

1

Non sono sicuro se è il problema, ma solo la finestra chiave riceve i gesti. La tua chiave è la tua finestra?

+0

Dovrebbe essere; è l'unica finestra nell'applicazione e riceve eventi di scorrimento. C'è qualcosa che potrebbe rendere non la chiave oltre a me attivamente non impostarla come chiave? – nomothetis

+0

Le finestre non chiave continuano a ricevere eventi scrollwheel (ecco perché è possibile trascinare due dita sulle finestre in background.) –

+0

Ho controllato; è la chiave. Vedrò se riesco a creare un piccolo progetto per riprodurre il comportamento (ciò accade attualmente in un'app di dimensioni medie). – nomothetis

2

provare con [self setAcceptsTouchEvents:YES]; in cui si dice // Initialization code here.

+0

Credo che tu intendessi [self setAcceptTouchEvents: YES]; –

+0

O semplicemente sostituisci acceptTouchEvents per restituire SÌ per la visualizzazione. – uchuugaka