Jak zachować pozycję przewijania w NSScrollView podczas zmiany skali?
Wcześniej uzyskałem NSView (myView) zawinięty w NSScrollView (myScrollView). Używając przycisków powiększania / zmniejszania, użytkownik może zmienić skalę myView. Jeśli użytkownik jest obecnie przewijany do określonego miejsca w myView, chciałbym zachować tę część widoku na ekranie po dokonaniu powiększenia.
Mam kod, który wygląda tak:
// 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]];
Wygląda na to, że jest blisko, ale nie jest w porządku i nie mogę zrozumieć, co robię źle. Moje dwa pytania to:
1) Czy nie ma czegoś wbudowanego na wzór:
[myView adjustScaleBy: 0.5 whilePreservingLocationInScrollview:myScrollView];
2) Jeśli nie, czy ktoś może zobaczyć, co robię źle w podejściu „dookoła”, powyżej?
Dzięki!