Domanda

Ho due NSScrollView di con scorrimento sincronizzato con l'altro (utilizzando esempio di Apple) e sta funzionando. Prossimo ho implementato uno zoom che avrebbe zoom entrambe le immagini (che hanno la stessa dimensione per definizione). Il codice per lo zoom è stato adattato utilizzando il codice da qui , che vi presento qui:

    if (oldZoomValue > [sender floatValue]) // then we are zooming in
{
    float zoomFactor = 1 + oldZoomValue - [sender floatValue];

    oldZoomValue = [sender floatValue];

    NSRect visible = [synchroS_ScrollView documentVisibleRect];
    NSRect newrect = NSInsetRect(visible, NSWidth(visible)*(1 - 1/zoomFactor)/2.0, NSHeight(visible)*(1 - 1/zoomFactor)/2.0);
    NSRect frame = [synchroS_ScrollView.documentView frame];

    [synchroS_ScrollView.documentView scaleUnitSquareToSize:NSMakeSize(zoomFactor, zoomFactor)];
    [synchroS_ScrollView.documentView setFrame:NSMakeRect(0, 0, frame.size.width * zoomFactor, frame.size.height * zoomFactor)];
    [[synchroS_ScrollView documentView] scrollPoint:newrect.origin];

    NSRect visibleI = [synchroI_ScrollView documentVisibleRect];
    NSRect newrectI = NSInsetRect(visibleI, NSWidth(visibleI)*(1 - 1/zoomFactor)/2.0, NSHeight(visibleI)*(1 - 1/zoomFactor)/2.0);
    NSRect frameI = [synchroI_ScrollView.documentView frame];

    [synchroI_ScrollView.documentView scaleUnitSquareToSize:NSMakeSize(zoomFactor, zoomFactor)];
    [synchroI_ScrollView.documentView setFrame:NSMakeRect(0, 0, frameI.size.width * zoomFactor, frameI.size.height * zoomFactor)];

    [[synchroI_ScrollView documentView] scrollPoint:newrectI.origin];
}
else
{
// the equivalent but for zoom-out
}

Se uso la funzionalità di zoom senza sincronizzato scorrimento di, entrambe le immagini sulla NSScrollView ingrandito bene come previsto. Tuttavia, se sono sincronizzati, il programma si blocca con esso sembra essere una pila di diverse chiamate: sul thread principale, mostra un sacco di cose come

#18 0x0000000100003e37 in -[SynchroScrollView synchronizedViewContentBoundsDidChange:] ()

e sul GDB:

This GDB was configured as "x86_64-apple-darwin".tty /dev/ttys000
sharedlibrary apply-load-rules all
[Switching to process 33162 thread 0x0]
[Switching to process 33162 thread 0xac03]
[Switching to process 33162 thread 0x903]
warning: Unable to restore previously selected frame.
warning: Unable to restore previously selected frame.
...
(gdb)

Qualcuno può punto me una direzione per il debug o ha idea che cosa sta accadendo? Grazie per il vostro aiuto.

È stato utile?

Soluzione

Non sono sicuro dove si chiama il codice per lo zoom del ScrollView, ma forse lo zoom in ScrollView A trigger zoom in ScrollView B, che a sua volta trigger zoom in ScrollView Un nuovo, creando un ciclo infinito. cambiando i limiti del metodo synchronizedViewContentBoundsDidChange avrebbe chiamato più e più volte lo stesso metodo.

So che questa domanda è a pochi mesi di vita, ma forse questo aiuta:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top