NSPopover с NSTextField показывает текстовое поле с непрозрачным фоном при его открытии, а затем становится прозрачным после анимации всплывающего окна.

На самом деле поведение разных ОС немного отличается
Вот как выглядит всплывающее окно при анимации открытия в версии 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 имеет фон/границу, а представление контейнера сохраняет прозрачный фон. Только после того, как всплывающее окно будет полностью показано, фон/граница также станут прозрачными.

Также здесь находится xib:
введите здесь описание изображения

Как это могло произойти?

Я попытался установить свойство цвета фона и попытался установить свойства в -awakeFromNib вместо init, но безрезультатно.


person A O    schedule 20.10.2016    source источник


Ответы (1)


Решена проблема, в построителе интерфейса приходилось проверять вид и метку в "Инспекторе эффектов просмотра", который устанавливает wantsLayer = YES

Возможно, это можно было бы сделать и программно

person A O    schedule 03.11.2016