Увеличение изображения в NSScrollview в Objective-C
-
27-10-2019 - |
Вопрос
У меня есть два NSSccrollview с прокруткой, синхронизированной друг с другом (используя Пример 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
}
Если я использую функциональность Zoom без синхронизированного прокрутки, оба изображения на 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)
Может ли кто -нибудь указать мне направление для отладки или иметь представление о том, что происходит? Спасибо за помощь.
Решение
Я не уверен, куда вы называете код для масштабирования ScrollView, но, возможно, увеличивая ScrollView, что увеличивает триггеры в ScollView B, что, в свою очередь, вызывает увеличение ScollView A, создавая бесконечный цикл. Изменение границ в synchronizedViewContentBoundsDidChange
Метод будет вызывать тот же метод снова и снова.
Я знаю, что этому вопросу несколько месяцев, но, может быть, это помогает :)