Полосы прокрутки NSScrollView имеют неправильную длину - PullRequest
3 голосов
/ 31 декабря 2011

У меня есть окно Какао, представление содержимого которого содержит NSScrollView, которое, в свою очередь, содержит NSView фиксированного размера.

При запуске программы отображаемые вначале полосы прокрутки слишком малы, как будторазмер контента был намного больше, чем на самом деле:

enter image description here

Когда я начинаю играть, например, с вертикальной полосой прокрутки, и возвращаю ее в исходное положение вверху,его размер изменяется до ожидаемого размера (который соответствует соотношению размеров прокрутки и представлений содержимого):

enter image description here

(обратите внимание на горизонтальную полосу, которая по-прежнему имеет неправильный размер. ЕслиЗатем я играю с ним и возвращаю его в крайнее левое положение, размер изменяется до нужного.)

Ответы [ 3 ]

2 голосов
/ 18 мая 2012

Я также столкнулся с той же проблемой, я искал везде, но, похоже, никто другой не сталкивается с этой проблемой.К счастью, я нашел хак, который решает проблему.

Что я заметил, так это то, что при изменении размера окна или его увеличении полосы прокрутки изменяются до ожидаемого размера (необходимо изменить авторазмер).Это происходит потому, что при изменении размера окна вид прокрутки и длина полос прокрутки пересчитываются и вычисляются правильно.Возможно, из-за некоторой ошибки длины полосы прокрутки не были правильно рассчитаны при инициализации.В любом случае, чтобы решить проблему, в вашем приложении делегат создаст выход к вашему окну.Переопределите метод «applicationDidFinishLaunching» и внутри него вызовите метод «frame» на выходе окна, который возвращает текущий NSRect окна.Используя возвращаемое значение, добавьте его к size.width и size.height.Вызовите метод setFrame с дисплеем, установленным в YES.Это изменит размер окна и заставит пересчитывать размер полос прокрутки.

Вот код для applicationDidFinishLaunching Ниже

(void)applicationDidFinishLaunching:(NSNotification *)aNotification
{

     // Get the current rect
     NSRect windowRect = [_window frame];`

     // add one to the width and height to resize window
     windowRect.size.width += 1;
     windowRect.size.height += 1;

     // resize window with display:YES to redraw window subviews
     [_window setFrame:windowSize display:YES];

}
1 голос
/ 27 сентября 2012

Я столкнулся с этой проблемой при изменении размера textContainer NSTextView для переключения переноса строк. Изменение размера вмещающего вида приводит к тому, что используется правильная высота вида прокрутки, но это жестокое решение.

NSScrollView поддерживает -reflectScrolledClipView. Вызов этого напрямую в моем случае не имел никакого эффекта, кроме случаев, когда он задержан на runloop:

[textScrollView performSelector:@selector(reflectScrolledClipView:) withObject:textScrollView.contentView afterDelay:0];

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

NSDisableScreenUpdates();
[textScrollView display];
[textScrollView reflectScrolledClipView:textScrollView.contentView];
[textScrollView display];
NSEnableScreenUpdates();
0 голосов
/ 01 декабря 2013

Опираясь на ответ из jstuxx выше, если вы не хотите, чтобы размер окна заметно изменялся, попробуйте:

NSRect windowRect = [[[self view] window] frame];
windowRect.size.width += 1;
windowRect.size.height += 1;
[[[self view] window] setFrame:windowRect display:YES];
windowRect.size.width -= 1;
windowRect.size.height -= 1;
[[[self view] window] setFrame:windowRect display:YES];

Мне пришлось поместить этот код после того, как я программно добавил представление прокрутки в мой интерфейс.

...