NSScrollView прыгает снизу на прокрутке
У меня есть NSScrollView, содержащий NSImageView, который изменяется на основе различных факторов. Когда он меняет размеры, я вообще изменил изображение, поэтому я прокручиваю NSScrollView до вершины. Это прекрасно работает. Однако, когда я снова прокручиваю NSScrollView, он перемещает несколько пикселей, а затем (большую часть времени) переходит к нижней части прокрутки. После того, как он скачет один раз, он работает нормально, пока я снова не переместил скроллер. Это сводит меня с ума. Все, что я действительно делаю, это:
[_imageView setImage: anNSImage];
NSRect frame;
NSSize imageSize = [anNSImage] size];
frame.size = imageSize;
frame.origin = NSZeroPoint;
[_imageView setFrame: frame];
[[_mainScrollview contentView] scrollToPoint: NSMakePoint(0, [_imageView frame].size.height - [_mainScrollview frame].size.height)];
Ответы
Ответ 1
Ник, спасибо за ваш код.
Я изменил ваш код, и теперь он работает хорошо.
Во-первых, вам нужно прокрутить вертикальный скроллер вверх. Во-вторых, прокрутите представление содержимого.
// Scroll the vertical scroller to top
if ([_scrollView hasVerticalScroller]) {
_scrollView.verticalScroller.floatValue = 0;
}
// Scroll the contentView to top
[_scrollView.contentView scrollToPoint:NSMakePoint(0, ((NSView*)_scrollView.documentView).frame.size.height - _scrollView.contentSize.height)];
Ответ 2
Чтобы обойти эту ошибку, вам просто нужно включить скроллеры, а затем установить скрытое свойство скроллеров. Поскольку NSScrollers наследуются от NSView, это просто мешает им отображать себя:
mainScrollView.hasHorizontalScroller = YES;
mainScrollView.hasVerticalScroller = YES;
mainScrollView.verticalScroller.hidden = YES;
mainScrollView.horizontalScroller.hidden = YES;
Работает для меня как минимум. Проверено только на OS 10.7.2.
Кто-нибудь имеет радар, поданный на этот бит? Они не исправят это, если никто не скажет им.:)
Ответ 3
Кажется, я могу использовать reflectScrolledClipView:
вместо заданных значений скроллеров для синхронизации позиции. Пример.
[self.scrollView.contentView scrollToPoint:NSMakePoint(300, 0)];
[self.scrollView reflectScrolledClipView:self.scrollView.contentView]; // synced then
Ответ 4
Мое взломанное решение. Включите Show Vertical Scroller (как сказал Четтан, это и вызывает ошибку). Отправляйте стол назад. Разверните левый край представления таблицы до тех пор, пока скроллер не будет закрыт любым правым краем.
Ответ 5
на macOS Sierra, [_scrollView.contentView scrollToPoint:];
был ошибкой и вызывал неустойчивое мерцание. Однако, используя [_scrollView.documentView scrollPoint:]
, я выяснил все эти проблемы для меня. Это также предлагаемый метод Apple в их учебнике нашел здесь.
Ответ 6
Вы устанавливаете scrollView.contentOffset = CGPointMake (0,0). Или согласно вашему требованию. Установите contectoffset после изменения изображения.