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!

questionAnswers(3)

yourAnswerToTheQuestion