zrz*_*zka 8 cocoa objective-c nswindow
这是另一个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;
}
Run Code Online (Sandbox Code Playgroud)
......并被viewFrameDidChange:定义为......
- (void)viewFrameDidChange:(NSNotification *)note {
if ( note.object != self.contentView ) {
return;
}
[self display];
[self setHasShadow:NO];
[self setHasShadow:YES];
}
Run Code Online (Sandbox Code Playgroud)
......这是拥有适当NSWindow阴影的唯一方法.换句话说,只要窗口大小的变化,我要打电话display,setHasShadow:NO并setHasShadow:YES否则窗口阴影削弱-它不是围绕整个窗口-只是窗口的一部分,等等.
这确实有效,直到我开始设置动画高度.如果高度是动画的,阴影会被正确地重新计算和显示,但整个窗口和阴影都会闪烁,而且非常难看.
一个想法为什么阴影闪烁?我试图取代display,setHasShadow:NO/YES有[self invalidateShadow],但它并没有在所有的工作和阴影显示在一个错误的方式.
如何在无边框/透明窗口中使用阴影设置窗口高度的动画以避免闪烁?
这是闪烁阴影的视频.http://d.pr/v/lbkQ
阴影的计算和绘制是一个非常消耗资源的操作。因此,我不建议您在每次帧更改时都使阴影无效并重新计算阴影。另外,NSWindowDelegate有一个\xe2\x80\x93windowDidResize:方法,那为什么要用observer呢?
如何调整窗口大小?也许添加NSResizableWindowMask到窗口的样式蒙版可以解决问题?你应该尝试一下。
另一个建议 - 检查窗口的内容是否随窗口一起正确调整大小。您将窗口设置为透明。但如果窗口内没有内容,则不会显示阴影。您还可以尝试将视图作为子视图添加到现有窗口的 contentView 而不是替换它。
我的项目中几乎有相同的设置,我可以看出,当您调整窗口大小时,窗口的阴影显示正确。
\n\nPS 建议:不要在对象的初始化方法中依赖“self”。它可能尚未完全准备好使用。使用最小值初始化,在控制器中创建窗口后调整窗口(例如,您无法确定 setFrame:display 会以正确的尺寸执行您期望的操作)。您遇到的故障也可能与此有关。
\n