2009-07-11 5 views
8
- (void)mouseDragged:(NSEvent *)theEvent { 
    NSSize dynamicImageSize; 
    dynamicImageSize = [[self image] size]; 
    NSSize contentSize = [(NSScrollView*)[[self superview] superview] contentSize]; 
    if(dynamicImageSize.height > contentSize.height || dynamicImageSize.width > contentSize.width) 
    { 
     float x = startOrigin.x - ([theEvent locationInWindow].x - startPt.x); 
     float y = startOrigin.y - ([theEvent locationInWindow].y - startPt.y); 
     [self scrollPoint:NSMakePoint(x, y)]; 
    } 
} 

Dans le code ci-dessus j'ai besoin d'animer le défilement. Comment puis-je atteindre cet objectif? Merci.Comment animer un point de défilement?

+1

vous étiez en mesure de comprendre comment? On dirait une demande assez simple ... – Chetan

+0

@Chetan: +1, je voudrais savoir cela aussi – Dov

Répondre

6

Dans mon application, je mis boundsOrigin du clipView en utilisant son animateur:

[NSAnimationContext beginGrouping]; 
NSClipView* clipView = [[myView enclosingScrollView] contentView]; 
NSPoint newOrigin = [clipView bounds].origin; 
newOrigin.x = my_new_origin.x; 
[[clipView animator] setBoundsOrigin:newOrigin]; 
[NSAnimationContext endGrouping]; 
+2

Je serais prudent avec cette méthode - j'ai vu un comportement étrange (par exemple défilement des barres de défilement si la valeur de la nouvelle origine n'est pas un entier exact). A partir des documents d'Apple: ** Vous n'interagissez normalement pas directement avec la classe NSClipView; il est fourni principalement comme mécanisme de défilement pour la classe NSScrollView. ** Je suis tenté d'utiliser la méthode d'Abhi qui repose sur scrollPoint dans la vue du document. –

1

Je ne suis pas sûr s'il s'agit d'un type d'animation pris en charge, mais avez-vous essayé d'appeler via l'objet proxy animator?

par ex. [[self animator] scrollPoint:NSMakePoint(x, y)];

+0

Non, cela ne fonctionnera pas. Ce n'est pas une propriété animable prise en charge (bien que ce soit peut-être une bonne demande d'amélioration?). – kperryua

12

Vous pouvez créer une sous-classe de NSAnimation pour ce faire. J'en ai créé un dans le cadre d'un projet open source (avec une licence de domaine public).

Vous pouvez le trouver ici: https://github.com/abhibeckert/Dux/blob/master/Dux/DuxScrollViewAnimation.m (note: ce projet a ARC activé.Si vous n'utilisez pas ARC, vous devrez mettre à jour le cas échéant).

Exemple:

[DuxScrollViewAnimation animatedScrollToPoint:NSMakePoint(x,y) inScrollView:self.enclosingScrollView]; 
+0

Merci beaucoup. Cette classe est vraiment utile et l'animation fonctionne comme prévu. – aumanets

+1

@aumanets garder à l'esprit cela devrait probablement être revisité avec Mavericks. Je ne l'ai pas encore fait - les vues de défilement n'utilisent plus cubicEaseInOut. Je ne sais pas comment implémenter le nouvel algorithme. –

+0

N'a pas pensé à ça. Merci pour l'avertissement. – aumanets