Увеличить изображение в NSScrollView в target-c - PullRequest
0 голосов
/ 07 сентября 2011

У меня есть два NSScrollView с прокруткой, синхронизированной друг с другом (используя пример Apple ), и она работает.Затем я применил масштабирование, которое увеличит оба изображения (они имеют одинаковый размер по определению).Код для масштабирования был адаптирован с использованием кода из здесь , который я представляю здесь:

    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
}

Если я использую функцию масштабирования без синхронизированных прокруток, оба изображения в NSScrollView будут хорошо увеличеныкак и ожидалось.Однако, если они синхронизированы, программа аварийно завершает работу, и кажется, что это стек из нескольких вызовов: в главном потоке она отображает множество вещей, таких как

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

и на 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)

Может кто-нибудь указать мне направление для отладки или иметь какие-либо идеи, что происходит?Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 15 ноября 2011

Я не уверен, где вы вызываете код для масштабирования scrollView, но, возможно, увеличение scrollView A вызывает увеличение scrollView B, что, в свою очередь, снова вызывает увеличение scrollView A, создавая бесконечный цикл. изменение границ в методе synchronizedViewContentBoundsDidChange будет вызывать один и тот же метод снова и снова.

Я знаю, что этому вопросу несколько месяцев, но, возможно, это поможет:)

...