Tengo un NSView (myView) envuelto en un NSScrollView (myScrollView). Usando botones de acercamiento/alejamiento, el usuario puede alterar la escala de myView. Si el usuario se desplaza actualmente a un lugar específico en myView, me gustaría mantener esa parte de la vista en pantalla después de que se haya realizado el zoom.¿Cómo mantener la posición de desplazamiento en NSScrollView cuando se cambia de escala?
Tengo código que se parece a esto:
// 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]];
y parece una especie de cerca, pero no es del todo bien y no puedo averiguar lo que estoy haciendo mal. Mis dos preguntas son:
1) ¿No hay una incorporado en algo en la línea de:
[myView adjustScaleBy: 0.5 whilePreservingLocationInScrollview:myScrollView];
2) Si no es así, ¿alguien puede ver lo que estoy haciendo mal en mi "largo camino alrededor de "acercarse, arriba?
Gracias!
El efecto que quiero es: supongo que estoy mirando en el medio de la pantalla. Al acercar o alejar (zoom), mantén esa cosa en el medio de la pantalla. Gracias! – Olie
¡Excelente respuesta! En lugar de configurar floatValue en los scrollers después de haber desplazado mi vista al origen calculado, llamé a reflectScrolledClipView: en mi vista de desplazamiento. Esto parece tener las barras de desplazamiento en la posición correcta. No estoy seguro de si esto es correcto ya que esta es la primera aplicación de Mac que he creado, pero funciona para mí. – afarnham