7

アプリケーションバンドルから画像をロードするNSImageViewがあります。

それはそのように設定されています:

coverImage.image = [NSImage imageNamed:@"themeSignEnd.png"];
coverImage.imageScaling = NSImageScaleNone;
coverImage.imageAlignment = NSImageAlignLeft;

画像は問題なく表示されます。

NSImageViewのサイズは、他のいくつかの要因に基づいて計算され、次のコードを使用して設定されます。

coverImage.frame = CGRectMake((1280 - 869) / 2, 0, 869 * percentage, 800);

これは、最初に実行されたとき(アプリケーションの起動時)に完全に正常に機能します。

NSImageViewはサイズを引き継ぎ、含まれる画像は適切な境界で切り取られます。

残念ながら、アプリケーションの実行中にNSImageViewのサイズを変更しようとすると(上記と同じコードを使用して)、目に見えて更新されません。

NSLoggingはcoverImage.frame、フレーム自体が正しく更新されていることを示しています。ただし、フレームを縮小するときも拡大するときも、ビューは再描画されていないようです。さらに、アプリを終了して再起動すると、NSImageViewは正しい境界線を描画します。

何がそのような振る舞いを引き起こす可能性がありますか?

NSImageViewが単に再描画されない可能性はありますか?もしそうなら、どうすれば再描画を強制できますか?

この動作につながる可能性のある、見逃したNSImageViewの他の癖はありますか?

編集:

このバグは、ImageFrameStyleプロパティがに設定されている場合にのみ発生することがわかりましたNSImageFrameNone。フレームが他の値に設定されている場合、フレームは正常に再描画されます。残念ながら、画像はフレームなしで表示する必要があります。

これを説明できるフレームがある場合とない場合のNSImageViewのレンダリングに違いはありますか?

4

4 に答える 4

5

NSImageView imageFrameStyleプロパティをに設定すると、非常によく似た問題が発生しましたNSImageFrameNone。自動レイアウト設定に問題があることが発生しました。ここで私の質問を確認できます:フレームスタイルがNSImageFrameNoneの場合、NSImageViewは画像を縮小しません

于 2013-11-19T18:19:12.517 に答える
1

だから私はこれを回避する方法を見つけました、しかしそれはかなりハックです。

編集で述べたように、このバグはImageFrameStyleがNSImageFrameNoneに設定されている場合にのみ発生します。ImageFrameStyleを別の値に設定し、サイズを変更してから、サイズ変更後にNSImageFrameNoneに再度設定すると、正常に機能します。

[coverImage setImageFrameStyle: NSImageFramePhoto];
coverImage.frame = CGRectMake((1280 - 869) / 2, 0, 869 * percentage, 800);
[coverImage setImageFrameStyle: NSImageFrameNone];

これは機能しますが、あまりきれいではありません。したがって、より良い答えを見つけるために、質問をあと2、3日開いたままにしておきます。

于 2011-08-13T17:12:36.330 に答える
0

NSImageViewが単に再描画されない可能性はありますか?もしそうなら、どうすれば再描画を強制できますか?

試してみてください[imageView setNeedsDisplay: YES]

于 2011-08-13T16:59:28.877 に答える
0

レイヤーバックビューを使用すると、予期しない動作が発生しました。これらのタイプのビューでは、レイヤーは画像を含む描画されたものをキャッシュし、予期しない動作を引き起こします。レイヤーバッキングがオンになっているかどうかを確認するには、NSViewの「wantsLayer」プロパティが何に設定されているかを確認してください。

于 2013-07-10T23:49:40.867 に答える