5

NSBox コントロールを含むウィンドウがあります。その NSBox には、他のいくつかのコントロール (ポップアップ、テキスト フィールドなど) があります。

同じ NIB ファイルに、特定の条件下で最初のコントロールと交換したいコントロールで満たされた 2 つの NSBox があります。素敵なクロスフェード効果でこれを実現したいので、次のようにします。

NSWindowController の-awakeFromNibメソッドで:

[[self.myWindow contentView] setWantsLayer:YES];

ビューを切り替える方法では、次のコードを使用します。

[[[self.myWindow contentView] animator] replaceSubview:previousView with:newView];

これは問題なく機能し、期待どおりにビューがクロスフェードします。問題は、ビューのコントロールが明確な理由もなく消えることがあるということです。常に同じビューとは限りません (ただし、NSPopUpButton は特にその傾向があるようです)。通常、フォーカスがあると再び表示されます。

すべてのコントロール レイヤーもバッキングする必要がありますか?


更新: 明示的なグループ化でアニメーションをラップしても違いはありませんでした。Nib ファイルで setWantsLayer をオンにしても違いはありませんでしたが、興味深いのは、私がそうすると、含まれているビューがクリックされるまで NSPopupbuttons が消えることです。NSPopupbuttons でレイヤーを手動で設定しても、違いはありませんでした。

他の人がこの問題を抱えているようですが、投稿された解決策が見つかりません:

http://www.cocoabuilder.com/archive/message/cocoa/2008/3/30/202691 http://www.cocoabuilder.com/archive/message/cocoa/2008/4/25/205134

4

1 に答える 1

4

ビューがレイヤーに裏打ちされている場合、そのすべてのサブビューはレイヤーに裏打ちされているため、レイヤーに裏打ちされているように手動で設定する必要はありません。ここで何が起こっているかを確認するのに十分な情報があるかどうかはわかりませんが、明示的なグループ化でアニメーションをラップすると、異なる動作が得られるかどうかに興味があります:

[NSAnimationContext beginGrouping];
[[[self.myWindow contentView] animator] replaceSubview:previousView with:newView];
[NSAnimationContext endGrouping];

また、setWantsLayer: を nib に設定するだけでなく、awakeFromNib で呼び出す理由はありますか (NSView インスペクターにチェックボックスが必要です)。

于 2008-10-31T23:13:09.883 に答える