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 после изменения изображения.