ここに別の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