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

person Nick Locking    schedule 22.12.2010    source источник
comment
Я комментирую в надежде, что этот вопрос будет кем-то замечен, потому что я уже совсем отчаялся. Мой NSScrollView теперь перевернут, что работает лучше, потому что я могу просто вообще не делать scrollToPoint. В этом случае точка прокрутки остается статической, когда я меняю содержимое, поэтому, если я переключаюсь вверху, она остается там.   -  person Nick Locking    schedule 05.01.2011
comment
Тем не менее, я все еще хочу установить его изначально. Ставлю один раз, меняет положение, начинаю листать, прыгает в самый низ. Я пытался установить ReflectScrolledClipView, но безрезультатно.   -  person Nick Locking    schedule 05.01.2011
comment
У меня проблема почти такая же как у вас, кто может помочь? stackoverflow.com/questions/6596567/   -  person disorderdev    schedule 07.07.2011
comment
Я сталкиваюсь с той же проблемой. Это ошибка в NSScrollView? Потому что я не могу найти ни одного ответа в Интернете, а этот вопрос задавали несколько раз. Есть ли обходной путь?   -  person Chetan    schedule 26.07.2011
comment
Кроме того, дайте мне угадать. Вы скрыли вертикальный скроллер в режиме прокрутки? Потому что я думаю, что это то, что вызывает эту (потенциальную) ошибку.   -  person Chetan    schedule 26.07.2011


Ответы (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)];
person Vince Yuan    schedule 27.12.2011
comment
Спасибо! гах, это то, что, наконец, сработало... теперь мне нужно понять, почему scrollToPoint: работает все время, но scrollPoint: и scrollRectToVisible: иногда проблематичны. - person Keith Knauber; 20.11.2015

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

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

По крайней мере, у меня работает. Однако тестировалось только на ОС 10.7.2.

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

person felinira    schedule 03.01.2012
comment
Это работает, но вы должны быть осторожны при установке свойства hidden. Видимо, windowDidLoad рановато, например. - person jmk; 18.10.2012

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

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

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

person Charlton Provatas    schedule 24.03.2017

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

person overcyn    schedule 17.10.2011

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

person Raxit    schedule 22.12.2010
comment
Только UIScrollView имеет свойство contentOffset. NSScrollView нет. - person Nick Locking; 22.12.2010