Смешивание слоистых представлений с не слоистыми представлениями, приводящее к странным углам окон за пределами границ - PullRequest
0 голосов
/ 25 января 2019

Так что, к сожалению, это один из случаев, когда трудно дать MVCE, но я постараюсь описать все как можно более подробно.

Так что у меня программно сконструировано NSWindow, как это-

_window = [[NSWindow alloc] initWithContentRect:_frameRect styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskTexturedBackground backing:NSBackingStoreBuffered defer:NO];
if ([_window respondsToSelector:@selector(titlebarAppearsTransparent)])
{
   _window.titlebarAppearsTransparent = true;
}
CGFloat x = (_window.screen.frame.size.width - _window.frame.size.width) / 2, y = (_window.screen.frame.size.height - _window.frame.size.height) / 2;
[_window setFrameOrigin:NSMakePoint(x, y)];
[[_window standardWindowButton:NSWindowZoomButton] setHidden: YES];
[[_window standardWindowButton:NSWindowMiniaturizeButton] setHidden: YES];
_window.backgroundColor = [NSColor colorWithHexColorString:@"f4f7fc"];

Затем я программно изменяю contentView, устанавливая различные производные классы NSView для представления содержимого.Я всегда передаю им один и тот же _frameRect, который использовался при создании окна.

Все было хорошо, пока я не добавил класс, который использует анимацию ключевого кадра.Мне пришлось добавить слой, и теперь - любой вид, установленный как contentView после этого вида, имеет странные черные углы, выходящие из закругленных углов окна.Неисправный вид создается следующим образом:

-(instancetype)initWithFrame:(NSRect)frameRect
{
   if (self = [super initWithFrame:frameRect])
   {
       self.wantsLayer = YES;
       _spinnerImageView = [[NSImageView alloc] initWithFrame:NSMakeRect(348, 342, 24, 24)];
       _spinnerImageView.wantsLayer = YES;
       [_spinnerImageView setLayer:[CALayer layer]];
       NSMutableArray<NSImage*>* images = [NSMutableArray arrayWithCapacity:30];
       for (NSUInteger spinnerImageIndex = 0; spinnerImageIndex < 30; ++spinnerImageIndex)
       {
           NSString* image = [NSString stringWithFormat:@“frame-%@“, @(spinnerImageIndex)];
           [images addObject:[NSImage imageNamed:image]];
       }
       _spinnerAnimation = [CAKeyframeAnimation animationWithKeyPath:kAnimationKey];
       [_spinnerAnimation setCalculationMode:kCAAnimationDiscrete];
       [_spinnerAnimation setDuration:0.75f];
       [_spinnerAnimation setRepeatCount:HUGE_VALF];
       [_spinnerAnimation setValues:images];
       [self addSubview:_spinnerImageView];
       _pleaseWaitText = [NSAttributedString viewTitleWithText:@“Please wait...“];
       [self resetToInitialState];
       _loadingButton = [[DisabledButton alloc] initWithFrame:NSMakeRect(288, 16, 144, 32) andText:@“Please wait...“];
       [self addSubview:_loadingButton];
   }
   return self;
}

Итак, что происходит, экран с анимацией выглядит хорошо (обратите внимание на углы): Window with correct corners После того, как я перейду из этого видак новому, для которого wantsLayer не установлено YES Я получаю поврежденные углы: enter image description here Это только пример, но в основном переход от вида с анимацией к любым другим причинам видачерные границы.

Теперь я попытался прочитать в системе слоев, но не смог точно определить, что именно я делаю неправильно.Я предполагал, что смешивание представлений с неслойной и слоистой подложкой может что-то испортить, но при установке wantsLayer на YES для всех видов я получаю разные артефакты.Я действительно надеюсь, что чёрная угловая штуковина вызовет рефлекс «О, это вызвано» у кого-то более опытного в Какао.

...