3

そのため、Cocoa アプリでこの奇妙な問題が発生しています。ツールバー項目、および一部の NSImageView は、明らかな理由もなく、画像を上下逆さまにレンダリングします。何らかの理由でアプリを起動すると (アイコンはコードで割り当てられます)、ツールバー項目が実際にそのようになり、その後、ファインダー ズーム効果で HUD を開くと、それに含まれる imageView が上下逆になります。

代替テキスト

上の画像は、この奇妙な現象のスクリーンショットです。ご覧のとおり、「Show Trash」アイテムは、HUD のすべての NSImageView で奇妙に回転しますが、NSBrowser の NSImageView は問題ありません。

これを引き起こしている原因を追跡し、それを修正するにはどうすればよいですか?

4

2 に答える 2

13

Mac OS X 開発者リリース ノート - AppKit リリース ノート (Snow Leopard)を参照してください。

ツールバーの画像の反転 (2009 年 1 月のシード以降の新機能)

setFlipped:YES反転したグラフィックス コンテキストに描画する予定の画像を呼び出してしまうのは、一般的ではありますが正しくない方法です。画像が後で通常の反転されていないコンテキストに描画されると、画像が上下逆に表示されるため、これは正しくありません。ただし、Leopard 以前には、 NSToolbarItem( 経由で) に設定されたイメージがそのプロパティsetImage:を無視するというバグが含まれていました。isFlippedSnowLeopard では、SnowLeopard で 10.6 SDK を使用してコンパイルされたアプリのこのバグが修正されています。その結果、Leopard では逆さまに描画されるはずだった一部の画像が、アプリを再コンパイルすると逆さまになり始めます。

SnowLeopard でアプリを再コンパイルし、ツールバー項目の画像が上下逆さまに描画されていることを発見した場合はsetFlipped:YES、コード内のどこかで呼び出しを行っていることを示しています。これらの呼び出しを削除し、画像の描画を、反転したコンテキストを正しく処理するメソッドに置き換える必要があります。詳細についてはsetFlipped:、これらのリリース ノートの の説明を参照してください。

Re:setFlipped:

NSImage: -[NSImage setFlipped:] の廃止、コンテキストの反転を考慮した描画メソッドの追加 (WWDC 2008 以降の新機能)

の反転属性NSImageは広く誤解されています。SnowLeopard では非推奨とし、その一般的な使用法をエラーの少ない API に置き換えます。

プロパティは、 の内部座標系の方向を記述しNSImageます。スーパービューがそのサブビューの反転を気にしないのと同様に、 のユーザーはその反転を気にするNSImage べきではありません。

[image setFlipped:[[NSGraphicsContext currentContext] isFlipped]]典型的な (欠陥のある) 使用例は、描画の直前に呼び出そうとすることですが、これは意図した目的を達成しません。キャッシングの前に呼び出された場合、表現は逆さまにキャッシングされ、フリップはキャッシュに吸収されます。キャッシュ後に呼び出された場合、効果はありません。キャッシュされた表現には、必要なフリッピングが既に組み込まれているはずです。前者の場合、後で別の場所に を描画すると、そのNSImage場所で上下が逆になってしまいます。バグとバグの表現が離れているため、これも紛らわしい場所です。反転に関する理解の欠如は、パフォーマンスの低いコードの原因となることが多く、フレームワークのバグを回避するために不要な中間バッファを作成します。フレームワークは設計どおりに動作しますが、期待に反し、セマンティクスはそれほど有用ではありません。-[NSImage isFlipped]多くのコードが現在の動作に非常に密接に依存しているため、のセマンティクスを変更することも困難です。これを試みるのではなく、プロパティを非推奨にしました。

反転または反転していないコンテキストで画像を描画するための簡単で正しい方法を提供しています。これは、コンテキストの反転を説明できる描画方法です。のヒントに一致する Hints パラメータも追加しています-bestRepresentationForRect:context:hints:

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

YESforを渡してrespectFlipped、派手な新しい動作を取得します。CTM を理解し、このメソッドには奇妙な相互作用があり、CTM を変更すると画像描画に影響を与えない可能性があることを心配している方への注意: これは事実ではありません。このメソッドは、 に基づいて動作を分岐し [[NSGraphicsContext currentContext] isFlipped]ます。CTM を変更すると、軸が上下逆になる場合がありますが、 の結果は変わりません -[NSGraphicsContext isFlipped]。それらは完全に直交しています。

の 2 番目の有効な使用法は-[NSImage setFlipped:]、 を介して取得したコンテキストの反転を指定することでした-[NSImage lockFocus]。を介して直接描画するなどNSLayoutManager、反転したコンテキストが必要な場合があります。このケースをカバーするために、追加します

- (void)lockFocusFlipped:(BOOL)flipped;

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

于 2011-01-21T04:07:04.417 に答える
3

私の思いつきでは、画像が誤ってそれを-setFlipped:YES呼び出したということです。

于 2011-01-21T04:01:49.753 に答える