带有 NSTextField 的 NSPopover 在打开时显示具有不透明背景的文本字段,然后在弹出动画之后变为透明

NSPopover with a NSTextField shows the text field with an opaque background as it's opening, and then goes transparent after the popover animation

不同操作系统之间的行为实际上略有不同
这是弹出窗口在 10.10 中以动画方式打开时的样子:

如果仔细观察,您会看到 NSTextField

周围有一个不透明的小边框

这是 10.11 中的样子:
只有一个笔直的不透明背景

下面是弹出窗口在动画之后的样子,完整显示:

修改弹出窗口的外观并不能解决问题:

我们这里有一个 NSViewController,它只有一个容器 NSView 和一个 NSTextField。容器使我们可以通过自动布局约束添加填充

@interface MessageViewController ()
@property (strong) IBOutlet NSTextField *messageLabel;
@property (weak) IBOutlet NSLayoutConstraint *rightPadding;
@property (weak) IBOutlet NSLayoutConstraint *topPadding;
@property (weak) IBOutlet NSLayoutConstraint *bottomPadding;
@property (weak) IBOutlet NSLayoutConstraint *leftPadding;
@end

@implementation MessageViewController

@synthesize message = _message;

- (instancetype)initWithMessage:(NSString *)message andPadding:(CGFloat)padding
{
   self = [super init];
   if( self )
   {
      [self loadView];
      self.rightPadding.constant = padding;
      self.topPadding.constant = padding;
      self.bottomPadding.constant = padding;
      self.leftPadding.constant = padding;
      self.message = message;
   }
   return self;
}

- (void)setMessage:(NSString *)message
{
   _message = message;
   self.messageLabel.stringValue = message;
}

- (NSString *)message
{
   return _message;
}

这就是为什么您可以看到边框,并且只有一部分弹出框是不透明的。内部 NSTextField 具有 background/border,并且容器视图保持透明背景。直到弹出窗口完全显示 background/border 也变得透明

这里还有 xib:

怎么会这样?

我尝试设置背景颜色 属性,并尝试在 -awakeFromNib 中而不是在 init 中设置属性,但无济于事

解决了这个问题,在界面生成器中必须检查 "View Effects Inspector" 中的视图和标签,它设置了 wantsLayer = YES

可能也可以通过编程方式完成