2013-06-04 8 views
9

イメージビューのソースが属性インスペクタからあらかじめ設定されている場合、/ howがファイルの実際のパスが解決されたときに解決されますか? NSBundleへの呼び出しはないようですが、間違っている可能性があります。UIImageViewのイメージがInterface Builderから設定されている場合、そのイメージはどのように読み込まれますか?

EDIT:後で資産を後で動的に置き換えるために(可能であれば)どのようなメソッドを呼び出そうとしています。

enter image description here

+1

を経由して、いくつかの内部機構を介してロードされていますか? – borrrden

+1

[UIImage imageNamed:]と呼ばれることがありますか?私はすごい忍者ではないので、あなたはそれをどのように上書きできるのか分かりません。 – morningstar

+0

良い推測ですが、そのメソッドを使用していないようです。 – kasrak

答えて

9

なしのUIImageイニシャライザまたはファクトリが呼び出されています。
私はデバッガ(iOS Simulator 7.0.3)でいくつかの調査を行い、次のように見つけました。
1)UIImageViewは、IBで設定されており、-initWithCoder:で初期化されています。
2)initWithCoder:の方法でdecodeObjectForKey:が呼び出されます。 UIImageという名前の(!)キーには、IBの画像が含まれています。この画像はsetImage:セッターではなく、イージーを通してUIImageViewに設定されています。
コンパイル中にIBが生の画像データをXIB/Storyboardにパックするようです。ナンセンスですが、本当です。なぜ我々は+imageNamed:またはいくつかの他の工場をスウィズルすることはできませんだとretina4とiOS6

EDITための設定画像に条件付きコードを使用する必要があり

コメントは、コンパイル済みのIBファイルのhexdumpingは内部名をpngをしていることを表示します。出力を見て実際に

、 "hexdumpが-C バイツ-38-t0r - ビュー - 8BC-XF-vdC.nib" PNGのファイル名は、コンパイルされたファイルに表示されていることを示しています。したがって、同じバンドルのファイル名を使用してファイルデータ をロードする必要があります。

しかし、彼らはまだそれだけでビューコントローラがであるバンドルに対する相対ではないでしょうないimageNamed:

+0

はい...そういうわけで、imageNamedのようないくつかのメソッドをうろつける方法はありませんか? – jerrygdm

+0

あなたはそれを振りかざすことができますが、この特定の仕事のためには利益は得られません。 –

+1

"IBパックの生の画像データをXIBにパックする"というコメントは理にかなっていません。私はちょうどコンパイルされたストーリーボードを見て、画像データが出力ファイルBYZ-38-t0r-view-8bC-Xf-vdC.nibにインライン化されていないことを発見しました。実際、 "hexdump -CYZ-38-t0r-view-8bC-Xf-vdC.nib"の出力を見ると、コンパイルされたファイルにPNGのファイル名が表示されます。したがって、同じバンドルのファイル名を使用してファイルデータをロードする必要があります。 – MoDJ

2

iOSが自動的にあなたのXIBファイルと同じバンドル内のファイルoverflow.pngを探します。 xibファイルがアプリケーションのターゲットにある場合、デフォルトではメインバンドルの内部を調べます。

あなたはプログラム的にイメージビューに新しいイメージをロードすると、あなたのイメージはメインバンドル内にある場合:

UIImage *image = [UIImage imageNamed:@"MyAwesomeImage"]; 
self.imageView.image = image; 

あなたのイメージは、別のバンドル内にある場合:

NSBundle *imageBundle = ... // [NSBundle mainBundle] if your image is inside main bundle 
NSString *imagePath = [imageBundle pathForResource:@"MyAwesomeImage" ofType:@"png"]; 
UIImage *image = [UIImage imageWithContentsOfFile:imagePath]; 
self.imageView.image = image; 
+0

はい、パス? (私はモチベーションのために編集を参照してください)。 – kasrak

+0

@kasrak、あなたは画像のパスをoverflow.pngしたいですか?メインバンドルに入っていますか? –

+0

私は非常にはっきりとは思わなかった。ストーリーボード/ xibからロードするときにランタイムが実際にUIImageViewをどのように初期化するのか疑問に思っています。これにより、コードを変更せずにアプリ内の画像を自動的に置き換えることができます。 – kasrak