Question

J'ai deux NSScrollView avec défilement de synchronisation avec l'autre (en utilisant exemple d'Apple de ) et il fonctionne. Ensuite, je mis en place un zoom qui zoomer les images (ils ont la même taille par définition). Le code pour le zoom a été adapté en utilisant le code de , que je vous présente ici:

    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
}

Si j'utilise la fonctionnalité de zoom sans défilement synchronisé de, les deux images sur le NSScrollView avez bien comme prévu. Toutefois, si elles sont synchronisées, le programme se bloque avec elle semble être une pile de plusieurs appels: sur le thread principal, il montre beaucoup de choses comme

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

et sur la 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)

point Quelqu'un peut-il me une direction pour le débogage ou une idée de ce qui se passe? Nous vous remercions de votre aide.

Était-ce utile?

La solution

Je ne sais pas où vous appelez le code pour zoomer la ScrollView, mais le zoom peut-être dans ScrollView A déclencheurs dans ScrollView B zooming, qui déclenche à son tour un zoom ScrollView A nouveau, créant une boucle sans fin. la modification des limites dans la méthode synchronizedViewContentBoundsDidChange appellerait encore et encore la même méthode.

Je sais que cette question est quelques mois, mais peut-être cela aide:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top