をアニメーション化する際に影をちらつきここで別の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;
}
を持っています.. 。そしてviewFrameDidChange:
が、これは適切なNSWindow
影を持っている唯一の方法です...
- (void)viewFrameDidChange:(NSNotification *)note {
if (note.object != self.contentView) {
return;
}
[self display];
[self setHasShadow:NO];
[self setHasShadow:YES];
}
...と定義されます。それはウィンドウ全体の周りではありません - - 言い換えれば、いつでもウィンドウサイズの変更、私はそうでない場合は、ウィンドウの影が不自由さdisplay
、setHasShadow:NO
とsetHasShadow:YES
を呼び出す必要がありますなど、ウィンドウの一部だけ
私が開始するまで、この作業を行いますアニメーションの高さ。高さがアニメーション化されている場合、シャドウは正しく再計算されて表示されますが、全体のウィンドウ&のシャドウはちらつきますが、かなり醜いです。
なぜ影がちらついているのでしょうか? display
、setHasShadow:NO/YES
を[self invalidateShadow]
に置き換えようとしましたが、全く動作せず、影が間違った方法で表示されます。
ちらつきを避けるために、ボーダーレス/トランスペアレントウィンドウでシャドーでウィンドウの高さをアニメートする方法はありますか?
ここでは、ちらつきの影の映像があります。 http://d.pr/v/lbkQ
私はこれを検索しましたが、これは非常に難しい質問です。 Appleとのデベロッパーテクニカルサポートを行うことをお勧めします(デベロッパーとして年間2人無料)。私はそこの誰かがあなたのためにこの問題を解決できると確信しています。 – sangony
制御された環境で問題を再現しようとしましたが、失敗しました。同じタイプの透明なウィンドウ(透明なクリップ付き)では、ちらつきのない良いシャドウが得られます。私はサイズ変更の通知を無効にすることさえしました。 [コードはこちらです](https://dl.dropboxusercontent.com/u/20258059/WindowShadows.zip)。おそらく、それは影自体とは関係がありませんが、最終的には影に影響を与える内面図を再描画します。ウィンドウのサイズ変更は、ウィンドウをクリックすることによって行われます。 – aLevelOfIndirection