gpt4 book ai didi

objective-c - NSView 或 NSWindow 中的漏洞

转载 作者:太空狗 更新时间:2023-10-30 03:20:13 25 4
gpt4 key购买 nike

是否可以切掉 NSWindow 或 NSView 的一部分并让它们看透?我有一个带有 NSView 的 NSWindow,我想:

A) 在 NSWindow 上打一个洞以便能够看透它或

B) 将我的 NSWindow 背景设置为具有清晰的颜色,然后在顶部制作一个 NSView 并设置我的 NSViews 不透明度的特定部分,以便能够看到桌面。

这是我要创建的效果:

enter image description here

最佳答案

是的,这是可能的,而且实际上并不难。

在您的窗口子类中,您需要将窗口背景颜色设置为透明

self.backgroundColor = NSColor.clearColor;

并告诉合成引擎你的窗口部分是透明的,需要在窗口移动时重绘

[self setOpaque:NO];

在 macOS 的早期版本中没有必要设置背景颜色,许多答案仍然没有提到这一事实。我已经验证至少从 macOS 10.11 开始它是必要的。

在你的 NSView 子类中,你必须用你选择的颜色渲染新背景(否则窗口是完全透明的,只有标题栏会显示)然后用

在 View 中渲染一个洞
NSRectFillUsingOperation(NSMakeRect(50, 50, 100, 100), NSCompositingOperationClear);

这提供了预期的效果,也适用于 Mojave 的黑暗模式等。

window with hole in dark mode

完整代码:

@interface MyWindow : NSWindow
- (id)initWithContentRect:(NSRect)contentRect styleMask:( unsigned int)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag;
@end

@implementation MyWindow
- (id)initWithContentRect:(NSRect)contentRect styleMask:( unsigned int)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag {
self = [super initWithContentRect:contentRect styleMask : aStyle backing :bufferingType defer:flag ];
if (self)
{
self.backgroundColor = NSColor.clearColor;
[self setOpaque:NO];
[self setHasShadow:NO];
}
return self;
}
@end

@interface MyView : NSView
- (void)drawRect:(NSRect)rect;
@end

@implementation MyView
- (void)drawRect:(NSRect)rect
{
[[NSColor windowBackgroundColor] set];
NSRectFill(self.bounds);
NSRectFillUsingOperation(NSMakeRect(50, 50, 100, 100), NSCompositingOperationClear);
}
@end

关于objective-c - NSView 或 NSWindow 中的漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9969924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com