【问题标题】:How to make a MTKView inside a NSScrollView show the scrollbars如何使 NSScrollView 中的 MTKView 显示滚动条
【发布时间】:2025-12-22 10:50:06
【问题描述】:

如果我将窗口大小调整为小于金属视图,我可以看到滚动条一秒钟,但我无法单击它们,它们也保持可见。你知道我怎样才能改变这种行为吗?只要窗口小于金属视图,我希望滚动条可见且可点击。

    nsview = gdk_quartz_window_get_nsview(window);

    NSScrollView *scroll_view = [[NSScrollView alloc]initWithFrame: [nsview frame]];
    [scroll_view setBorderType: NSNoBorder];
    [scroll_view setHasVerticalScroller: YES];
    [scroll_view setHasHorizontalScroller: YES];
    [scroll_view setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable];

    [nsview addSubview: scroll_view];

    self->clip_view = [[DvFlippedClipView alloc]initWithFrame: [nsview frame]];
    [scroll_view setContentView: self->clip_view];

    self->mtk_view = [[MTKView alloc]initWithFrame: [nsview frame]
                                            device: self->device];

    self->mtk_view.framebufferOnly = YES;
    self->mtk_view.autoResizeDrawable = NO;

    self->mtk_view.translatesAutoresizingMaskIntoConstraints = NO;

    self->mtk_view_delegate = [[DvMetalViewDelegate alloc] init: self->mtk_view];
    self->mtk_view.delegate = self->mtk_view_delegate;

    [scroll_view setDocumentView: self->mtk_view];

从另一个回调中,我执行以下操作:

    [self->mtk_view setBounds:NSMakeRect(0, 0, width, height)];
    [self->mtk_view setFrame:NSMakeRect(0, 0, width, height)];
    self->mtk_view.drawableSize = CGSizeMake(width, height);

【问题讨论】:

  • 出于好奇,您为什么将MTKViewtranslatesAutoresizingMaskIntoConstraints 设置为false?删除那条线有帮助吗?
  • 我想我添加它是我解决此问题的尝试之一。删除该行不会改变问题。
  • 滚动本身是否真的有效(使用鼠标滚轮、多点触控鼠标或触控板)?
  • 它没有,滚动条只是在调整窗口大小期间出现一秒钟然后它们消失并且在边框周围移动鼠标不会显示滚动条,直到我再次调整大小...

标签: cocoa metal nsscrollview


【解决方案1】:

我昨天遇到了类似的问题,我怀疑奇怪的滚动行为和完全没有滚动可能源于我怀疑您的问题。如果您还没有找到答案,希望它至少能启发您或其他人。

我的视图层次结构如下所示:

问题是我将 MTKView 设置为 CenterTopViewController 的视图属性,而不是 Bordered Scroll View。这样做,出于所有实际意图和目的,从层次结构中删除了 MTKView 并将其设置为使其 superview 属性指向所有这些所在的拆分视图。滚动视图似乎不是响应者链的一部分,并且从未处理任何滚动事件(或至少没有以任何有意义的方式)。

将滚动视图设置为视图控制器的视图属性修复了所有问题。

附: 如果您对为什么在 MTKView 上方有一个不必要的视图感到困惑,那只是在我弄清楚之前几乎绝望地尝试发现问题的结果。我还没来得及修复它。

【讨论】: