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