( 以降の新しい2009年1月の種子)のツールバーにある反転を画像
共通だが間違った練習はあなたが描くことを計画 というイメージに コールsetFlipped:YES
にあります反転した グラフィックスコンテキストに変換します。これは間違った です。イメージが後で の通常のunflippedコンテキストに描画されると、 イメージは上下逆さまに表示されるためです。 しかし、Leopard以前のバージョンでは、 には NSToolbarItem
(setImage:
経由)に設定された画像がisFlipped
プロパティを無視するというバグが含まれていました。 SnowLeopardは、SnowLeopardで10.6 SDKを使用してコンパイルされた アプリのこのバグを修正しました。その結果、 の画像が逆さまになっている画像が Leopardにあります。 アプリを再コンパイルすると、そのようになります。
あなたは SnowLeopard上のアプリケーションを再コンパイルして、 ツールバー項目の画像が逆さま ドローダウンしていることが判明した場合、それはあなたが がどこか あなたのコード内でsetFlipped:YES
を呼び出していることを示しています。 これらの呼び出しを削除し、画像 を、 が反転したコンテキストを正しく処理する方法で置き換える必要があります。詳細については リリースノートの の説明を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軸に沿った正の数値が が下にあることを意味します。
「画像を描くためのシンプルで正確な方法を提供しています。 私はノブの "フィルムストリップ"タイプのアニメーションを使用しています。 NSImageの問題は、ロード/キャッシング時にイメージを静かに「反転」することです。 "respectFlipped"(フリップされたビュー)がなければ、画像は上下逆さまにレンダリングされます。しかし* * "respectFlipped"で私のフレームは正しい方法で描かれますが、それらは想定されている*逆の順序でアニメートされます。つまり、最初のフレームが最後になります。 これは非常に奇妙で、直感的ではありません。 - [NSImage isFlipped]を使用すると、問題はきちんと修正されます。私はそれが非難されるべきではないと思います。 –