Como manter a posição de rolagem no NSScrollView ao alterar a escala?

Eu tenho um NSView (myView) envolto em um NSScrollView (myScrollView). Usando os botões de zoom in / out, o usuário pode alterar a escala do myView. Se o usuário estiver atualmente rolando para um determinado ponto no myView, gostaria de manter essa parte da exibição na tela após o zoom ter ocorrido.

Eu tenho um código parecido com isto:

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

E parece meio que próximo, mas não está certo e não consigo entender o que estou fazendo de errado. Minhas duas perguntas são:

1) Não existe algo embutido nos moldes de:

   [myView adjustScaleBy: 0.5 whilePreservingLocationInScrollview:myScrollView];

2) Se não, alguém pode ver o que estou fazendo de errado na minha abordagem de "longo caminho", acima?

Obrigado!

questionAnswers(3)

yourAnswerToTheQuestion