NSScrollView滚动条的长度不正确

时间:2011-12-31 17:45:44

标签: cocoa nswindow nsscrollview

我有一个Cocoa窗口,其内容视图包含一个NSScrollView,它反过来包含一个固定大小的NSView。

启动程序后,最初显示的滚动条太小,就好像内容大小比实际大得多:

enter image description here

当我开始玩,例如,垂直滚动条,并将其恢复到顶部的原始位置时,它会调整为其预期大小(对应于滚动视图和内容视图大小的比率):

enter image description here

(注意水平条,它仍然有不正确的大小。如果我再玩它,然后把它带回到最左边的位置,它会被调整大小到正确的大小。)

3 个答案:

答案 0 :(得分:2)

我也遇到了同样的问题,我到处搜索但似乎没有其他人遇到这个问题。幸运的是,我找到了解决问题的黑客。

我注意到的是,当窗口调整大小或最大化时,滚动条会调整大小到预期的大小(必须启用自动调整大小)。这是因为当窗口调整大小时,滚动视图和滚动条的长度将被重新计算并正确计算。可能由于某些错误,初始化时无法正确计算滚动条长度。无论如何要解决问题,在您的应用程序委托中为您的窗口创建一个插座。覆盖“applicationDidFinishLaunching”方法,并在其内部调用窗口插座上的方法“frame”,它返回窗口的当前NSRect。使用返回的值将size.width和size.height添加一个。调用方法setFrame,显示设置为YES。这将调整窗口大小并强制重新计算滚动条的大小。

以下是applicationDidFinishLaunching Below

的代码
(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 :(得分:1)

在修改NSTextView textContainer大小以切换换行时遇到此问题。调整封闭视图的大小确实会导致使用正确的滚动视图高度,但这是一个残酷的解决方案。

NSScrollView支持-reflectScrolledClipView。直接在我的情况下调用它没有任何效果,除非在runloop上延迟:

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

滚动条位置正确但滚动条重绘。因此看起来好像在绘制时计算了视图几何体的一部分。因此,更好的解决方案是:

NSDisableScreenUpdates();
[textScrollView display];
[textScrollView reflectScrolledClipView:textScrollView.contentView];
[textScrollView display];
NSEnableScreenUpdates();

答案 2 :(得分:0)

基于上面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];

我必须将此代码放在我以编程方式将滚动视图添加到界面的位置之后。