2009-11-27 9 views
7

J'ai un IKImageBrowserView que je veux pouvoir zoomer avec un trackpad multi-touch sur un ordinateur portable Mac récent.Comment interpréter les gestes de pincement du trackpad pour zoomer IKImageBrowserView

Guide Event Handling Cocoa, dans la section Handling Gesture Events dit:

La méthode accesseur agrandissement retourne un virgule flottante (CGFloat) valeur représentant un facteur de grossissement

.. et continue à afficher le code qui ajuste la taille de la vue en multipliant la hauteur et la largeur par magnification + 1.0.

Cela ne semble pas être la bonne approche pour le zoom IKImageBrowserView, dont la propriété zoomValue est bloquée entre 0.0 et 1.0.

Alors, est-ce que quelqu'un sait comment interpréter l'événement dans -[NSResponder magnifyWithEvent:] pour zoomer IKImageBrowserView?

Répondre

14

C'est ce que je fais, sur Snow Leopard, il fonctionne parfaitement bien:

En 10.6, NSEvent a la méthode « grossissement » qui renverra la bonne quantité déjà. Tout ce que vous avez à faire est d'ajouter ceci à l'ancienne valeur, comme [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]; 
     } 
    } 
} 

Voici la sous-classe IKImageBrowserView. J'ai un seuil ici pour que le zoomValue ne puisse pas être plus petit que 0.45, mais c'est comme ça que je l'aime.

Cordialement, Matthias, Software Tempêtes Eternal

+0

Fonctionne parfaitement. Je vous remercie. –

4

Si vous ajoutez l'agrandissement de l'événement à votre facteur de zoom, le même événement ne sera pas le même effet en fonction du facteur de zoom. L'ajout d'un grossissement de 0.1 à un facteur de zoom de 1 va zoomer par 10%, mais si le facteur de zoom est 0.1, l'ajout de 0.1 doublera votre zoom.

Le résultat de la multiplication du facteur de zoom par magnification + 1.0 sera plus cohérent.

Je préfère multiplier le facteur de zoom par std::exp(magnification), car il semble être une solution plus naturelle. Un grossissement de -n va effectuer un zoom arrière exactement de la même quantité qu'un grossissement de n zoome.