J'ai un NSView (myView) enveloppé dans un NSScrollView (myScrollView). En utilisant les boutons de zoom avant/arrière, l'utilisateur peut modifier l'échelle de myView. Si l'utilisateur est en train de défiler jusqu'à un endroit particulier dans myView, j'aimerais conserver cette partie de la vue à l'écran après le zoom.Comment maintenir la position de défilement dans NSScrollView lors du changement d'échelle?
J'ai le code qui ressemble à ceci:
// preserve current position in scrollview
NSRect oldVisibleRect = [[myScrollView contentView] documentVisibleRect];
NSPoint oldCenter = NSPointFromCGPoint(CGPointMake(oldVisibleRect.origin.x + (oldVisibleRect.size.width/2.0),
oldVisibleRect.origin.y + (oldVisibleRect.size.height/2.0)));
// adjust my zoom
++displayZoom;
[self scaleUnitSquareToSize:NSSizeFromCGSize(CGSizeMake(0.5, 0.5))];
[self calculateBounds]; // make sure my frame & bounds are at least as big as the visible content view
[self display];
// Adjust scroll view to keep the same position.
NSRect newVisibleRect = [[myScrollView contentView] documentVisibleRect];
NSPoint newOffset = NSPointFromCGPoint(CGPointMake((oldCenter.x * 0.5) - (newVisibleRect.size.width/2.0),
(oldCenter.y * 0.5) - (newVisibleRect.size.height/2.0)));
if (newOffset.x < 0)
newOffset.x = 0;
if (newOffset.y < 0)
newOffset.y = 0;
[[myScrollView contentView] scrollToPoint: newOffset];
[myScrollView reflectScrolledClipView: [myScrollView contentView]];
Et il semble sorte de près, mais ce n'est pas tout à fait raison et je ne peux pas comprendre ce que je fais mal. Mes deux questions sont:
1) est-il pas intégré quelque chose le long des lignes de:
[myView adjustScaleBy: 0.5 whilePreservingLocationInScrollview:myScrollView];
2) Dans le cas contraire, peut-on voir ce que je fais mal dans mon « chemin autour "approche, ci-dessus?
Merci!
L'effet que je veux est: supposons que je regarde au milieu de l'écran. Comme je zoom-in (ou -out), gardez cette chose au milieu de l'écran. Merci! – Olie
Excellente réponse! Au lieu de définir floatValue sur les scrollers après avoir fait défiler ma vue vers l'origine calculée, j'ai appelé reflectScrolledClipView: dans ma vue déroulante. Cela semble obtenir les barres de défilement dans la bonne position. Je ne sais pas si c'est correct car c'est la toute première application Mac que j'ai créée, mais ça marche pour moi. – afarnham