这是另一个NSWindow
问题......我有无边框窗口,透明,这是以这种方式创建的......
- (id)initWithView:(NSView *)view anchorPoint:(NSPoint)anchorPoint position:(NSPoint)position distance:(CGFloat)distance {
if ( !view ) {
return nil;
}
NSSize size = view.intrinsicContentSize;
NSRect contentRect = NSMakeRect( 0, 0, size.width, size.height );
self = [super initWithContentRect:contentRect
styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered
defer:NO];
if ( !self ) {
return nil;
}
_windowView = view;
_anchorPoint = anchorPoint;
_position = position;
_distance = distance;
[self setContentView:_windowView];
[self setExcludedFromWindowsMenu:YES];
[self setMovableByWindowBackground:NO];
[self setOpaque:NO];
[self setBackgroundColor:[NSColor clearColor]];
[self setHasShadow:YES];
[self useOptimizedDrawing:YES];
[self setReleasedWhenClosed:NO];
[self setFrame:[self windowRectWithSize:contentRect.size] display:YES];
[self setAnchorAttribute:NSLayoutAttributeTop forOrientation:NSLayoutConstraintOrientationVertical];
[self setAnchorAttribute:NSLayoutAttributeCenterX forOrientation:NSLayoutConstraintOrientationHorizontal];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(viewFrameDidChange:)
name:NSViewFrameDidChangeNotification
object:nil];
return self;
}
...而viewFrameDidChange:
定义为......
- (void)viewFrameDidChange:(NSNotification *)note {
if ( note.object != self.contentView ) {
return;
}
[self display];
[self setHasShadow:NO];
[self setHasShadow:YES];
}
......这是获得正确NSWindow
阴影的唯一方法。换句话说,每当窗口大小发生变化时,我都必须调用display
,setHasShadow:NO
和setHasShadow:YES
,否则窗口阴影会瘫痪 - 它不在整个窗口周围 - 只是窗口的一部分,等
这一直有效,直到我开始设置动画高度。如果高度是动画的,则正确地重新计算和显示阴影,但整个窗口和&阴影闪烁,非常难看。
为什么阴影会闪烁?我尝试将display
,setHasShadow:NO/YES
替换为[self invalidateShadow]
,但它根本不起作用且阴影以错误的方式显示。
如何在无边框/透明窗口中使用阴影设置窗口高度的动画以避免闪烁?
这是闪烁阴影的视频。 http://d.pr/v/lbkQ
答案 0 :(得分:2)
也许最好在动画开始时关闭阴影,并在完成后重新开启。动画期间请勿切换此设置。我以为我也和其他窗户见过这个。
答案 1 :(得分:2)
阴影计算和绘图是一项非常耗费资源的操作。因此,我建议您不要在每次帧更改时使影子无效并重新计算。此外, NSWindowDelegate 有一个–windowDidResize:
方法,为什么要使用观察者?
如何调整窗口大小?也许在窗口的样式掩码中添加NSResizableWindowMask
可以解决问题吗?你应该试一试。
另一个建议 - 检查窗口内容是否与窗口一起正确调整大小。您将窗口设置为透明。但如果窗口内没有内容,则不显示阴影。您还可以尝试将视图作为子视图添加到现有窗口的contentView中,而不是替换它。
我的项目中的设置几乎相同,我可以告诉您在调整窗口大小时正确显示窗口的阴影。
P.S。建议:不要在对象的初始化方法中依赖'self'。它可能尚未完全准备好使用。初始化为最小值,在控制器中创建窗口之后调整窗口(例如,您无法确定setFrame:display会按照您所期望的正确尺寸执行操作)。你所遇到的故障也可能与此有关。