可可的不同透明度?

时间:2012-02-03 20:55:16

标签: objective-c macos cocoa

我已经超载了NSWindow并创建了我自己的自定义窗口(无边框和0.3 alphaValue的透明度)。我将在这个窗口中绘制图像。有什么方法可以让我在窗口中绘制的图像不透明吗?我希望窗口保持透明,但希望图像不透明。我该怎么做?

Mac OS X Snow Leopard Xcode 3.2.6

3 个答案:

答案 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}}