我已经超载了NSWindow并创建了我自己的自定义窗口(无边框和0.3 alphaValue的透明度)。我将在这个窗口中绘制图像。有什么方法可以让我在窗口中绘制的图像不透明吗?我希望窗口保持透明,但希望图像不透明。我该怎么做?
Mac OS X Snow Leopard Xcode 3.2.6
答案 0 :(得分:1)
@ughoavgfhw走在正确的轨道上,但实际上要容易得多。您只需将opaque
设置为NO
并将backgroundColor
设置为半透明。
@implementation MYWindow
- (void)setup
{
[self setStyleMask:NSBorderlessWindowMask];
[self setOpaque:NO];
[self setBackgroundColor:[NSColor colorWithCalibratedWhite:1.0 alpha:0.3]];
}
// We override init and awakeFromNib so this works with or without a nib file
- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag
{
self = [super initWithContentRect:contentRect styleMask:aStyle backing:bufferingType defer:flag];
if (self)
{
[self setup];
}
return self;
}
- (void)awakeFromNib
{
[super awakeFromNib];
[self setup];
}
@end
答案 1 :(得分:1)
这种方法存在潜在问题 请求“[self setStyleMask:NSBorderlessWindowMask];” (使用任何可能的StyleMask值)将导致在窗口的后续演示中作为工作表丢失击键事件到该窗口。我今天向Apple报告了一个错误。
答案 2 :(得分:0)
将alphaValue
属性保留为1,并将opaque
属性设置为NO
。然后,将默认contentView
替换为在drawRect:
方法中使用其alpha分量为0.3的颜色填充自身的alphaValue
。更改setContentView:
属性时,它会更改窗口中绘制的所有内容的显示方式。当你使它不透明时,它根本不会在内容视图下面绘制黑色背景,因此如果内容视图是透明的,那么窗口也是如此,但是在其上绘制的任何内容都不会受到影响。
这是一个使用带有0.3 alpha分量的白色背景的示例。请注意,我覆盖了@interface MyWindow_ContentView : NSView
@end
@implementation MyWindow
- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag {
if(self = [super initWithContentRect:contentRect styleMask:aStyle backing:bufferingType defer:flag]) {
[super setOpaque:NO];
[super setContentView:[[[MyWindow_ContentView alloc] init] autorelease]];
}
return self;
}
- (void)setOpaque:(BOOL)ignored {}
- (void)setContentView:(NSView *)newView {
NSArray *views = [[self.contentView subviews] copy];
[views makeObjectsPerformSelector:@selector(removeFromSuperview)];
views = [[newView subviews] copy];
[views makeObjectsPerformSelector:@selector(removeFromSuperview)];
for(NSView *view in views) [self.contentView addSubview:view];
[views release];
}
@end
@implementation MyWindow_ContentView
- (void)drawRect:(NSRect)rect {
[[NSColor colorWithCalibratedWhite:1 alpha:0.3] set];
NSRectFill(rect);
}
@end
方法。这样我就可以将传递视图中的任何视图复制到透明内容视图中,如果从nib加载窗口,则尤为必要,因为nib加载将在加载时更改内容视图。 (您可以改为在IB中更改内容视图的类。)
{{1}}