objective-c – NSWindow – 无边框,透明窗口 – 动画窗口高度时闪烁的阴影

objective-c – NSWindow – 无边框,透明窗口 – 动画窗口高度时闪烁的阴影,第1张

概述这是另一个NSWindow问题……我有无边框窗口,透明,这是以这种方式创建的…… - (id)initWithView:(NSView *)view anchorPoint:(NSPoint)anchorPoint position:(NSPoint)position distance:(CGFloat)distance { if ( !view ) { return nil; } 这是另一个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,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否则窗口阴影被削弱 – 它不在整个窗口周围 – 只是窗口的一部分,等等.

这确实有效,直到我开始设置动画高度.如果高度是动画的,则正确地重新计算和显示阴影,但是整个窗口和阴影闪烁,非常丑陋.

一个想法为什么阴影闪烁?我尝试用[self invalIDateShadow]替换display,setHasShadow:NO / YES,但它根本不起作用,阴影以错误的方式显示.

如何在无边框/透明窗口中使用阴影设置窗口高度动画以避免闪烁?

这是闪烁阴影的视频. http://d.pr/v/lbkQ

解决方法 阴影计算和绘图是一项非常耗费资源的 *** 作.因此,我建议您不要在每次帧更改时使影子无效并重新计算.此外,NSWindowDelegate有一个-windowDIDResize:方法,为什么要使用观察者呢?

>如何调整窗口大小?也许在窗口的样式掩码中添加NSResizableWindowMask可以解决问题吗?你应该试一试.
>另一个建议 – 检查窗口内容是否与窗口一起正确调整大小.您将窗口设置为透明.但如果窗口内没有内容,则不显示阴影.您还可以尝试将视图作为子视图添加到现有窗口的contentVIEw,而不是替换它.

我在项目中的设置几乎相同,我可以告诉您在调整窗口大小时正确显示窗口的阴影.

附:建议:不要在对象的初始化方法中依赖’self’.它可能尚未完全准备好使用.初始化为最小值,在控制器中创建窗口之后调整窗口(例如,您无法确定setFrame:display会按照您所期望的正确尺寸执行 *** 作).你所遇到的故障也可能与此有关.

总结

以上是内存溢出为你收集整理的objective-c – NSWindow – 无边框,透明窗口 – 动画窗口高度时闪烁的阴影全部内容,希望文章能够帮你解决objective-c – NSWindow – 无边框,透明窗口 – 动画窗口高度时闪烁的阴影所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1023974.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存