上記のグラデーションの問題がアプリケーションのTexture NSWindowsでも発生しましたが、この問題を解決するのに長い時間がかかりました。
この投稿にもう少し追加したいと思っています。他の開発者が解決策が今後より簡単に出てくるという同じ問題が発生していることが分かった場合は、
私の場合は、一連のテクスチャ付きウィンドウでアプリケーションを構築しました。 Dimillian77の問題と同様に、私のアプリケーションのメインウィンドウの背景テクスチャは、サブビューのサイズと配置の影響を受けていました。私のケースでは、メインウィンドウのNSWindowControllerがNSWindowControllerのユーザーがアクセスしているアプリケーションNSViewのサブビューのサイズと配置が各サブビューごとにわずかに異なるため、メインウィンドウの背景グラデーションがサブビューの背後を飛び回るので、これにより、ユーザーが各ビューを切り替えたときのグラデーションのバグがより明確になりました。
興味深いことに、勾配の問題は、OS X 10.7 Snow Leopardへの移行後にのみ現れました。同じ変更されていない同じソースコードと.xib/.nibファイルは、以前のバージョンのOS Xではこの問題を引き起こしませんでした。この問題はレーダーレポートにふさわしい新しいバグかもしれないとのココアヒーローの提案と一致しているようです - おそらく、マウンテンライオンで修正されているのでしょうか?
私のアプリケーションのメインNSWindowといくつかのサポートウィンドウはすべて、「Textured」(メタリック)バックグラウンドオプションを使用するように設定されていましたが、Snow Leopardへの移行後にのみグラデーション「バグ」が現れました。
この記事を見つける前に、私が問題を '解決する'ために遭遇した唯一の方法は、ウィンドウに「サイズ変更」コントロールを有効にしてグラデーションのバグが消えたことに気付いたことでした。
-(void)setShowsResizeIndicator:(BOOL)showResizeIndicator
と制御「のサイズ変更」、および-(NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize
への呼び出しをインターセプトすることにより、ウィンドウのサイズを変更するために、ユーザによって試みを上書きしかし、私は私の特定のアプリケーションのウィンドウがサイズ変更可能であることを望んでいませんでした、と私はタイトルバーを無効にすることができな限り、これは明らかにエレガントな解決策ではありませんでした。このソリューションは特に、ウィンドウ内のサイズを変更しようとしたときにユーザーが混乱していたため、カーソルがサイズ変更されたマウスカーソル(まだ隠すことができなかったもの)を表示していたため、失敗しました。
ありがたいことに、 "Content Border"設定を "None"に変更すると、Interface Builder(Xcode 4.3.3と統合されたバージョン)で勾配の問題が直ちに消えましたが、少なくとも私の場合は、この変更を加えた後にアプリケーションをコンパイルして実行すると、.xibファイルがロードされるとすぐにアプリケーションがクラッシュしました。トレースに次のエラーメッセージが表示されました。 "setAutorecalculatesContentBorderThickness:forEdge:非テクスチャウィンドウ内でNSMaxYEdgeを使用して呼び出すことはできません"。
「コンテンツ境界」の設定を「カスタム」に設定し、「上部」と「下部」のコンテンツの境界線を「1」に設定すると、クラッシュが解決されましたが、「カスタム"私は実験で" Custom Border "設定を" None "に変更し、アプリケーションをコンパイルして2回目のコンパイルで正常に実行できることを発見しました。
しかし、「コンテンツの境界線」を「自動サイズ変更」以外に変更すると、XCodeで数十の「不正な構成:Mac OS X 10.7より前の自動レイアウト」エラーが発生しました。 :10.6 "以前のMac OS Xバージョンの上/下のコンテンツ境界のプロパティの自動サイズ変更以外の値は、すべて「コンテンツボーダー」プロパティに関連しています(私のデプロイメントターゲットは10.7ではなくOS X 10.6に設定されています)。このように、エラーに対する別の解決策の探索が再開されたので、以下に詳述する解決策に至りました。私が見つけた解決策は、少なくともOS X 10.7では、Textureウィンドウの "Content Border"をInterface Builderで "Autosize"に戻し、代わりにコード内のコンテンツ境界設定をオーバーライドすることでした(私の場合はこのコードを配置します)私のテクスチャウィンドウののNSWindowControllerクラス)のそれぞれに:
// windowDidLoad is called when the window has loaded but before it's displayed...
-(void)windowDidLoad
{
// set the content border thickness to 0 for both the top and bottom window edges
[[super window] setContentBorderThickness:0 forEdge:NSMaxYEdge]; // top border
[[super window] setContentBorderThickness:0 forEdge:NSMinYEdge]; // bottom border
// disable the auto-recalculation of the window's content border
[[super window] setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge];
[[super window] setAutorecalculatesContentBorderThickness:NO forEdge:NSMinYEdge];
}
あなたは、コードを介して、または他のNSWindowの上のインターフェイスビルダーのいずれかを介してそれを設定しようとする場合にのみ、テクスチャウィンドウの一番上のコンテンツの境界線の太さを設定できることに注意してくださいアプリケーションがクラッシュする可能性があります。
NSWindowの文書によると、「setContentBorderThickness:forEdge:forwardingを呼び出す非テクスチャウィンドウでは、NSMaxYEdgeを渡すと例外が発生します。テクスチャウィンドウの上端のコンテンツのボーダーの太さを設定することが有効です。
OS X 10.7の「テクスチャ化」ウィンドウのレンダリングでは、勾配の問題が実際に新しいバグであるように見えるため、コンテンツの境界線をオーバーライドするコードを修正して、 OS X 10.7を実行しているシステム(およびMountain Lionで問題が修正されていない場合は、今後のOS Xのリリース)
この投稿は役に立ちましたか?このバグは本当に混乱していて、私が解決したいと思っていたよりもはるかに長くかかりました。そのような問題の疎密な文書があるように、私は、他の時間を節約し、オンライン検索を通じて問題をより多くの露出とキーワードに与えることを期待して自分の発見を投稿する価値があると感じました。
私は他の多くの人がこの問題を解決するためにまだ苦労しているので、彼らの答えなしで、ココア・ヒーローに行く必要があります。
あなたはただ問題を解決しました。コンテンツ境界線をカスタムに設定するだけで、グラデーションサイズをカスタマイズできます。わたしは、あなたを愛しています ! – Dimillian
あなたが私を愛しているなら、投票して答えとして選択してください! = Dああ、私もあなたを愛しています。 – cocoahero
だから最終的にifはおそらくappkitバグですが、簡単に解決できます。本当にありがとう、私はこのNSTextFieldのためにカスタムウィンドウを描画しようとしていました。 http://raven.ioの新しいUIを保存するだけです。 – Dimillian