Wie kann ich die Bildlaufposition in NSScrollView beibehalten, wenn ich den Maßstab ändere?

Ich habe ein NSView (myView) in ein NSScrollView (myScrollView) eingebunden. Mit den Schaltflächen zum Vergrößern / Verkleinern kann der Benutzer den Maßstab von myView ändern. Wenn der Benutzer gerade zu einer bestimmten Stelle in myView gescrollt ist, möchte ich diesen Teil der Ansicht nach dem Zoomen auf dem Bildschirm lassen.

Ich habe folgenden Code:

    // 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]];

Und es scheint ein bisschen eng zu sein, aber es ist nicht ganz richtig und ich kann nicht herausfinden, was ich falsch mache. Meine zwei Fragen sind:

1) Gibt es nicht ein eingebautes Etwas im Sinne von:

   [myView adjustScaleBy: 0.5 whilePreservingLocationInScrollview:myScrollView];

2) Wenn nicht, kann irgendjemand sehen, was ich oben in meinem "Umweg" -Ansatz falsch mache?

Vielen Dank!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage