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)];

6 ответов

Ник, спасибо за твой код. Я изменил ваш код, и теперь он работает хорошо. Сначала вам нужно прокрутить вертикальный скроллер до вершины. Во-вторых, прокрутите представление содержимого.

    // 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)];

Чтобы обойти эту ошибку, вам просто нужно включить скроллеры, а затем установить скрытое свойство скроллеров. Поскольку NSScrollers наследуют от NSView, это просто мешает им отображать себя:

mainScrollView.hasHorizontalScroller = YES;
mainScrollView.hasVerticalScroller = YES;
mainScrollView.verticalScroller.hidden = YES;
mainScrollView.horizontalScroller.hidden = YES;

У меня работает по крайней мере. Только проверено на OS 10.7.2.

У кого-нибудь есть радар, поданный на этом между прочим? Они не исправят это, если им никто не скажет.:)

В macOS Sierra, [_scrollView.contentView scrollToPoint:]; был глючит и вызывал странное мерцание. Однако используя [_scrollView.documentView scrollPoint:] прояснил все эти вопросы для меня. Это также предложенный метод Apple в их учебнике, найденном здесь.

Кажется я могу использовать reflectScrolledClipView: вместо установки значений скроллеров для синхронизации позиции. Ex.

[self.scrollView.contentView scrollToPoint:NSMakePoint(300, 0)];
[self.scrollView reflectScrolledClipView:self.scrollView.contentView]; // synced then

Мое хакерское решение. Включите Show Vertical Scroller (как сказал Четан, именно это и вызывает ошибку). Отправить вид таблицы назад. Расширяйте левый край представления таблицы, пока скроллер не будет покрыт чем-либо правым краем.

Вы устанавливаете scrollView.contentOffset = CGPointMake(0,0). Или согласно вашему требованию. Установите contectoffset после изменения изображения.

Другие вопросы по тегам