【问题标题】:NSTabView with background color带有背景颜色的 NSTabView
【发布时间】:2011-11-11 06:56:34
【问题描述】:

正如其他地方所讨论的,NSTabView 没有 setBackgroundColor 方法,并且子类化 NSTabView 并使用 drawRect 来控制它不再起作用 - 因为它不会绘制前 10%,即分段控制按钮下方的位。

现在我对解决这个问题的工作量感到有点惊讶;见

我想知道我是否走错了路。以及如何更好、更简单地做到这一点:

  • NSSegmentStyleTexturedSquare 似乎为我提供了一个半透明的分段控件。这意味着我需要做额外的工作来隐藏任何边框线(第 240、253 行)。

    • 有没有更好的方法来做到这一点? IE。否定它的透明度?

    • 或者有没有办法可以使用实际/原始分段选择按钮?

  • 我发现我需要的颜色——比如 [NSColor windowBackgroundColour] 没有设置为任何有用的颜色(即那个是透明的)——所以现在我对它们进行硬编码(第 87、94 行)。

    • 有更好的方法吗?
  • 我发现我需要一大堆蓬松的方法来保持同步(第 128、134 行等)。

    • 这可以避免吗?
  • 我发现模仿重新缩放的聪明才智意味着我需要持续关注分段控制框并删除/调整它的大小。即便如此 - 它还不如原来的那么好

    • 有没有比第 157 行更好的方法来做到这一点 - 即听说调整大小?而不是一直这样做?
  • 当焦点从窗口移开时,segementControl 会变暗 - 与真正的 McCoy 不同。

    • 这很容易避免吗?有没有便宜的方法来跟踪这个?
  • 或者这是错误的方法 - 我应该在这里只关注一个透明的洞 - 让 NSTabViewItem 绘制背景?但无论如何 - 那么我仍然有分段控制框的问题 - 或者有没有办法让它再次成为默认值。

    • 尝试此操作时 - 我卡在以“真实”窗口背景颜色(即“透明”)绘制的顶部 20-30 像素上,因此颜色不会一直运行到顶部或后面分段栏直到边框 - 而是在分段控件底部下方约 8 个像素处停止。

感谢您的反馈 - 因为对于这样一个简单的事情来说,这感觉太离谱/不太理想 - 非常感谢。黑客/分叉 github 代码的布朗尼积分 :) :) :) 正如一行运行代码所说的超过一千个单词。

Dw.

【问题讨论】:

    标签: macos cocoa nscolor nstabview


    【解决方案1】:

    PSMTabBarControl 可能是最适合您的解决方法。我已经创建了几个自定义选项卡视图,但可可不能很好地使用这个控件。 PSMTabBarControl 已更新以支持 Xcode 4。https://github.com/ciaran/psmtabbarcontrol

    【讨论】:

      【解决方案2】:

      您是否尝试过设置其底层 CALayer 的背景颜色? (如果还没有,通过设置 wantLayer = YES 将其设为 layer-backed view。)

      【讨论】:

      • 嗯 - 试过了(见上面的 github 链接,github.com/dirkx/CustomizableTabView/commit/…) - 设置为 plain.XXX。而且没有cookie。
      • drawsBackground 设置为什么?选项卡视图的类型是 NSNoTabsNoBorder 吗?您确定在调用 applicationDidFinishLaunching 时已经加载了 NIB?
      • 当然(并且将代码移动到 setColour 不会改变行为)。问题仍然是背景“逃脱”了标签视图的内容视图。
      • 在这种情况下,我可能会创建一个通用的 NSView,将其设置为想要一个图层,将图层的背景颜色设置为您想要的,然后将您的选项卡视图放置在该图层内或顶部其中。还是我不明白您要做什么?
      • 问题是每个单独的选项卡项都是在从 NSTabView 插入的子视图中绘制的。 NSTabView 框架太大,选项卡项目视图框架太小,留下原始问题中提到的差距。没有办法精确定位背景 NSView。
      【解决方案3】:

      如果您的情况可以容忍一些脆弱性,一个非常简单快捷的方法是子类NSTabView 并手动调整项目子视图的框架。这为每个项目提供了无缝的黄色背景:

      - (void)drawRect:(NSRect)dirtyRect {
          static const NSRect offsetRect = (NSRect) { -2, -16, 4, 18 };
      
          NSRect rect = self.contentRect;
      
          rect.origin.x += offsetRect.origin.x;
          rect.origin.y += offsetRect.origin.y;
          rect.size.width += offsetRect.size.width;
          rect.size.height += offsetRect.size.height;
      
          [[NSColor yellowColor] set];
          NSRectFill(rect);
      
          [super drawRect:dirtyRect];
      }
      

      NSTabView 指标的未来变化显然会是一个问题,因此请自行承担风险!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        • 1970-01-01
        • 2016-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多