Так что, к сожалению, это один из случаев, когда трудно дать 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;
}
Итак, что происходит, экран с анимацией выглядит хорошо (обратите внимание на углы): После того, как я перейду из этого видак новому, для которого wantsLayer
не установлено YES
Я получаю поврежденные углы: Это только пример, но в основном переход от вида с анимацией к любым другим причинам видачерные границы.
Теперь я попытался прочитать в системе слоев, но не смог точно определить, что именно я делаю неправильно.Я предполагал, что смешивание представлений с неслойной и слоистой подложкой может что-то испортить, но при установке wantsLayer
на YES
для всех видов я получаю разные артефакты.Я действительно надеюсь, что чёрная угловая штуковина вызовет рефлекс «О, это вызвано» у кого-то более опытного в Какао.