【问题标题】:NSScrollView scroll bars are of the wrong lengthNSScrollView 滚动条的长度错误
【发布时间】:2013-12-01 16:56:12
【问题描述】:

我有一个 Cocoa 窗口,它的内容视图包含一个 NSScrollView,而后者又包含一个固定大小的 NSView。

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

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

(请注意水平条,它的大小仍然不正确。如果我再玩它,并将其放回最左边的位置,它会被调整为正确的大小。)

【问题讨论】:

  • 您应该打印出来并检查滚动视图的contentSize 矩形,然后再触摸它。
  • 请提供更多信息。您如何/何时将自定义视图提供给滚动视图(在 Interface Builder 中还是在运行时设置)?正如迈克尔问的那样,一切都是什么尺寸(不仅仅是 -contentSize,还有你的自定义视图的框架)?
  • @Joshua 一切都在 Interface Builder 中简单设置,没有自定义代码。
  • @Michael 我的自定义视图大小始终保持不变 (1400x1000),滚动视图的 contentSize 也保持不变 (598x399,略小于滚动视图本身的框架 (600x401))。

标签: cocoa nswindow nsscrollview


【解决方案1】:

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

我注意到的是,当窗口调整大小或最大化时,滚动条会调整到预期大小(必须启用自动调整大小)。这是因为当窗口调整大小时,滚动视图和滚动条的长度会重新计算并正确计算。可能由于某些错误,在初始化时未正确计算滚动条长度。无论如何要解决此问题,请在您的应用程序委托中为您的窗口创建一个出口。覆盖“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];

}

【讨论】:

  • 我在 Lion 上遇到了同样的问题,上面的代码更正了它。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多