2009-11-27 7 views
7

Ho uno IKImageBrowserView che voglio essere in grado di pizzicare-zoom utilizzando un trackpad multitouch su un laptop Mac recente.Come interpretare i gesti di pizzicamento del trackpad per ingrandire IKImageBrowserView

The Cocoa gestione degli eventi Guida, nella sezione Handling Gesture Events dice: metodo di accesso

L'ingrandimento restituisce un valore floating-point (CGFloat) che rappresenta un fattore di ingrandimento di

.. e continua a mostrare il codice che regola le dimensioni della vista moltiplicando l'altezza e la larghezza di magnification + 1.0.

Questo non sembra l'approccio corretto per lo zoom IKImageBrowserView, la cui proprietà zoomValue è bloccata tra 0,0 e 1,0.

Quindi, qualcuno sa come interpretare l'evento in -[NSResponder magnifyWithEvent:] per ingrandire IKImageBrowserView?

risposta

14

Questo è quello che faccio, su Snow Leopard, funziona perfettamente:

Nel 10.6, NSEvent ha il metodo "ingrandimento", che restituirà già la giusta quantità. Tutto ciò che devi fare è aggiungerlo al vecchio valore, come [imageBrowser zoomValue]+[event magnification].

- (void)magnifyWithEvent:(NSEvent *)event 
{ 
    if ([event magnification] > 0) 
    { 
     if ([self zoomValue] < 1) 
     { 
      [self setZoomValue:[self zoomValue] + [event magnification]]; 
     } 
    } 
    else if ([event magnification] < 0) 
    { 
     if ([self zoomValue] + [event magnification] > 0.45) 
     { 
      [self setZoomValue:[self zoomValue] + [event magnification]]; 
     } 
     else 
     { 
      [self setZoomValue:0.45]; 
     } 
    } 
} 

auto qui è una sottoclasse IKImageBrowserView. Ho una soglia qui in modo che lo zoomValue non possa diventare più piccolo di 0.45, ma è proprio come mi piace.

Con i migliori saluti, Matthias, Eternal Storms Software

+0

Funziona perfettamente. Grazie. –

4

se si aggiunge l'ingrandimento evento al fattore di zoom, lo stesso evento non avrà lo stesso effetto in base al fattore di zoom corrente. L'aggiunta di un ingrandimento di 0.1 a un fattore di ingrandimento di 1 verrà ingrandita di 10%, ma se il fattore di zoom è 0.1, l'aggiunta di 0.1 raddoppierà lo zoom.

Il risultato della moltiplicazione del fattore di zoom per magnification + 1.0 sarà più coerente.

Preferisco moltiplicare il fattore di zoom per std::exp(magnification), in quanto sembra essere una soluzione più naturale. Un ingrandimento di -n ingrandirà esattamente dello stesso valore di ingrandimento di n ingrandito.