2011-11-11 84 views
2

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

现在我对解决这个问题的工作量感到有些惊讶,看到

,我想知道如果我去了错误的道路。而如何做到这一点更好&简单:

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

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

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

  • 我发现我的颜色需要 - 如[NSColor windowBackgroundColour]没有被设置为任何有用的东西(即,一个是透明的) - 所以现在我硬编码它们(线87,94)。

    • 有没有更好的方法来做到这一点?
  • 我发现我需要一大堆蓬松的方法来保持同步(第128,134行等)。

    • 这可以避免吗?
  • 我发现模仿巧妙的重新缩放意味着我需要不断关注segemented控制框并删除/调整大小。即使如此 - 它不如原来的

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

    • 可以很容易地防止?有没有一种便宜的方式来跟踪这个?
  • 或者这是错误的方法 - 我应该只关注这里的透明孔 - 并让NSTabViewItem绘制背景?但无论如何 - 那么我仍然有Segemented控制框的问题 - 或者有办法让它再次成为默认值。

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

反馈赞赏 - 因为这感觉太离谱/次优这样一个简单的事情 - 非常感谢。布朗尼指向黑客/分叉github代码:) :) :)作为一行代码运行超过一千字。

Dw。

回答

1

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

0

您是否尝试设置其底层CALayer的背景颜色? (通过设置wantsLayer = YES,使其成为层次支持的视图。)

+0

嗯 - 尝试过(见上文github上的链接,https://github.com/dirkx/CustomizableTabView/commit/bfbd5aeecaf13c65611d221a31cb644ed48108d4#diff-7d6a9b4a9a691023219e9dc3082910e6) - 设置以plain.XXX。并没有cookie。 –

+0

什么是drawsBackground设置为?标签视图的类型是NSNoTabsNoBorder?你确定NIB甚至在applicationDidFinishLaunching被调用的时候加载了吗? – dgatwood

+0

当然(并将代码移动到setColour不会改变行为)。问题仍然是背景'逃脱'tabview的内容视图的好处。 –

0

如果您的情况可以容忍一些脆弱性,一个非常简单和快速的方法是子类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度量未来的变化显然是一个问题,所以进行风险自负!