2011-01-21 3 views
3

私はこの奇妙な問題を私のCocoaアプリケーションに持っています。ツールバー項目といくつかのNSImageViewsは明らかな理由がなく、画像を上下逆さまにします。ツールバーの項目は、何らかの理由(アイコンがコードで割り当てられている)でアプリを起動した後、ファインダズームエフェクトでHUDを開くと、その中に含まれるimageViewsが上下逆さまになります。上記画像は、この奇妙な現象のscreensotあることNSImageViewsの画像はランダムに逆さまになっています

alt text

。表示されているように、 "Show Trash"項目は、HUD内のNSImageViewごとに奇妙に回転しますが、NSBrowserのNSImageViewは問題ありません。

これを引き起こしている原因を突き止め、それを修正する方法を教えてください。

答えて

13

Mac OS X Developer Release Note - AppKit Release Notes (Snow Leopard)参照:

( 以降の新しい2009年1月の種子)のツールバーにある反転を画像

共通だが間違った練習はあなたが描くことを計画 というイメージに コールsetFlipped:YESにあります反転した グラフィックスコンテキストに変換します。これは間違った です。イメージが後で の通常のunflippedコンテキストに描画されると、 イメージは上下逆さまに表示されるためです。 しかし、Leopard以前のバージョンでは、 には NSToolbarItemsetImage:経由)に設定された画像がisFlippedプロパティを無視するというバグが含まれていました。 SnowLeopardは、SnowLeopardで10.6 SDKを使用してコンパイルされた アプリのこのバグを修正しました。その結果、 の画像が逆さまになっている画像が Leopardにあります。 アプリを再コンパイルすると、そのようになります。

あなたは SnowLeopard上のアプリケーションを再コンパイルして、 ツールバー項目の画像が逆さま ドローダウンしていることが判明した場合、それはあなたが がどこか あなたのコード内でsetFlipped:YESを呼び出していることを示しています。 これらの呼び出しを削除し、画像 を、 が反転したコンテキストを正しく処理する方法で置き換える必要があります。詳細については リリースノートの の説明をsetFlipped:でご覧ください。

再:setFlipped:

NSImageでは:卑下 - [NSImageでは はsetFlipped:]、(WWDC 2008年から新 )コンテキストflippednessを尊重描画方法

反転を追加しますNSImageの属性は、広く誤解されている です。SnowLeopardの場合は が推奨されておらず、 の一般的な使用方法は、エラーが発生しやすい に置き換えられています。

このプロパティは、 NSImageという内部座標系の向き を表します。スーパービュー が のサブビューの反転を気にしないように、NSImage のユーザーは、その反転を気にする必要はありません。

典型的な(欠陥)ケースを使用して図面に[image setFlipped:[[NSGraphicsContext currentContext] isFlipped]]直前 を呼び出すために 試してみることですが、これは が意図した目標を達成しません。 がキャッシュする前に呼び出された場合、 の表現はキャッシングを 下にキャッシングし、キャッシュは に吸収されます。キャッシング後に呼び出された場合、 は効果がありません。キャッシュされた の表現は、すでに に必要な反転を組み込むと想定されています。 NSImageが後でどこにも描かれて であれば前者の場合 は、それはバグとバグの 式は遠く離れているので、また混乱 あること場所に逆さま を終了します。 についての理解の欠如 悪い実行コードの出典も頻繁にあります。 で人々が不要にする 中間バッファーを回避するには フレームワークのバグがあります。 フレームワークは、設計に従って動作しますが、期待に反して、 セマンティクスはそれほど有用ではありません。 のセマンティクスを-[NSImage isFlipped]、 に変更することも難しいです。多くのコードが現在の動作に非常に近似しているためです( )。 これを試みるのではなく、 は不動産を推奨していません。

我々は、コンテキスト flippednessを占めることができ 方法を描いているひっくり返したり unflippedコンテキストで画像を描画するためのシンプルかつ正しい 方法を提供しています。また、-bestRepresentationForRect:context:hints:のヒントに一致する のヒントパラメータを追加しています。 respectFlippedため

- (void)drawInRect:(NSRect)dstRect fromRect:(NSRect)srcRect operation:(NSCompositingOperation)op fraction:(CGFloat)alpha respectFlipped:(BOOL)respectContextIsFlipped hints:(NSDictionary *)hints;

パスYES空想新しい振る舞いを取得します。 1つの CTM を理解していて、この方法が奇妙な の対話を持っていることを心配している人は注意してください。CTM を変更すると、画像 の描画に何らかの影響がない可能性があります。この メソッドは、 [[NSGraphicsContext currentContext] isFlipped]に基づいて動作を分岐します。 CTMを変更すると、 軸が上下逆になることがありますが、 は -[NSGraphicsContext isFlipped]の結果を変更しません。それらは完全に直交しています。

-[NSImage setFlipped:]の第二の有効な使用は-[NSImage lockFocus]介し を得たコンテキストの flippednessを指定することでした。 の場合があります。たとえば、 からNSLayoutManagerまで直接描画する場合は、 のフリップされたコンテキストが必要です。このケースをカバーするために、我々は

- (void)lockFocusFlipped:(BOOL)flipped;

を追加 これは 画像自体、フォーカスがロックされている にのみコンテキストの状態を変更しません。つまり、ロックされた コンテキストでは、 (0,0)が左上にあり、Y軸に沿った正の数値が が下にあることを意味します。

+0

「画像を描くためのシンプルで正確な方法を提供しています。 私はノブの "フィルムストリップ"タイプのアニメーションを使用しています。 NSImageの問題は、ロード/キャッシング時にイメージを静かに「反転」することです。 "respectFlipped"(フリップされたビュー)がなければ、画像は上下逆さまにレンダリングされます。しかし* * "respectFlipped"で私のフレームは正しい方法で描かれますが、それらは想定されている*逆の順序でアニメートされます。つまり、最初のフレームが最後になります。 これは非常に奇妙で、直感的ではありません。 - [NSImage isFlipped]を使用すると、問題はきちんと修正されます。私はそれが非難されるべきではないと思います。 –

3

私の頭がおかしいのは、画像に誤って-setFlipped:YESが呼び出されたということです。

+0

私のコードではsetFlippedが使用されていないので、これは何らかの不思議なバグである必要がありますが、明示的にイメージを反転させないように設定することはそのトリックでした。何が起こる可能性がありますか?また、私はこの特定のグループのウィンドウを格納しているNIBでこれが起こっていることに気付きました。別のNIBにあったメインウィンドウはこれに影響されませんでした。 –

+1

- [NSImage setFlipped:]にシンボリックブレークポイントを設定して、いつ変化しているかを見ることができます。 –

関連する問題