【问题标题】:Subclassing NSView to have a transparent background子类化 NSView 以获得透明背景
【发布时间】:2011-06-05 20:19:22
【问题描述】:

我正在创建一个应用程序,其中我需要一个透明的 NSView,里面有一个透明的 PNG 图像。问题是,我正在绘制的 NSView 上面有灰色背景。我有它的子类(作为透明矩形视图),但不知道在 drawRect 中放置什么以使其透明。

我已经重写了 isOpaque 方法以返回 NO,但它似乎没有帮助...

或者,是否已经有一个类似于iPhone的UIImageView的子类NSView(只要我可以在里面添加子视图,我需要在里面添加一些文本)。

【问题讨论】:

  • Interface Builder 中没有透明度滑块吗?我似乎记得不小心调低了我的一个视图的不透明度。
  • 我几乎 100% 确定设置了整个视图的透明度,包括孩子。这意味着我所有的按钮和文本也将有 1% 的不透明度或其他。如果我错了,请告诉我:D
  • 等等,所以你只想要一个透明的背景颜色?我知道 UIViews 可以使用预定义的透明颜色,尽管我没有尝试将它与 NSViews 一起使用。
  • 是的,不过我在 Mac 上,所以 UIView 与 NSView 不同。无论如何,用 FakeImageView 解决了问题
  • @Andrew M,你错了,视图的透明度不会影响其子级。视图是相互独立绘制的。

标签: objective-c cocoa macos subclass nsview


【解决方案1】:

要使视图透明,只需用 [NSColor clearColor] 填充即可。

- (void)drawRect:(NSRect)rect {
    [[NSColor clearColor] set];
    NSRectFill(rect);
}

isOpaque 的默认实现返回 NO,因此如果您是子类化 NSView 而不是其他视图,则无需担心覆盖它。

【讨论】:

  • 这对以后很有用!谢谢!
  • 顺便说一句,我有理由确定如果您将drawRect: 留空,您将获得相同的效果,因为您将不会绘制任何内容。合理肯定 = 肯定,因为我经常这样做。
  • 除非您将窗口设置为不透明(窗口,而不是视图!NSView 默认不透明,但 NSWindow 默认不透明),否则您的代码将绘制黑色矩形。另请参阅此文本drissman.com/blog/archives/2009/10/09/… 因此,您要么想提及有关窗口的内容,要么使用文本中所示的 NSRectFillUsingOperation。哦,如果你的视图是分层的,它也可以工作,因为在这种情况下它有一个自己的绘图层。
  • @Mecki OP 似乎并没有要求让整个窗口透明。只是视图,以便您可以看到它下面的其他视图。
  • @ughoavgfhw 您似乎不明白:您的代码绘制黑色,除非窗口设置为非透明。 OP 是否需要非透明窗口并不重要,您的代码仅适用于非透明窗口。你有没有真正尝试过你的代码?
【解决方案2】:

接受的答案对我不起作用,因为我的窗口是不透明的。正如http://www.drissman.com/blog/archives/2009/10/09/nsrectfill_and_nscolor_clearcolor.html(以及下面的讨论)所说,以下代码有效:

- (void)drawRect:(NSRect)rect {
    [[NSColor clearColor] set];
    NSRectFillUsingOperation(rect, NSCompositeSourceOver);
    // do other drawings
}

【讨论】:

  • SourceOver 在大多数情况下是默认的合成操作。这与[NSBezierPath fillRect:] 没有什么不同,而且效率都低于NSRectFill,后者(不寻常地)使用NSCopyCompositeOperation。而且,正如 d11wtq 在接受的答案中所说,这无论如何都不是必需的——视图本身已经是透明的,除非你在其他地方绘制。
  • @PeterHosey 您是否阅读过链接中的文字内容?不,不一样。具有透明颜色的 NSRectFill 仅在窗口未明确设置为不透明时才有效,当然,您可以做什么,但如果您的窗口实际上是不透明的,则会浪费大量计算时间。如果窗口不透明,NSRectFillUsingOperation 将正常工作。链接中的文字很好地解释了这一点,并且为我节省了大量工作。
【解决方案3】:

Swift 版本:

override func draw(_ dirtyRect: NSRect) {

    NSColor.clear.set()
    dirtyRect.fill()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2011-04-16
    • 2012-06-11
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多