當從屬性檢查器中預設圖像視圖的源時,文件的實際路徑何時/如何解析?似乎沒有任何呼叫NSBundle,但我可能是錯的。當從Interface Builder設置UIImageView的圖像時,該圖像如何加載?
編輯:我試圖調整任何方法被調用(如果可能)以後動態替換資產。
當從屬性檢查器中預設圖像視圖的源時,文件的實際路徑何時/如何解析?似乎沒有任何呼叫NSBundle,但我可能是錯的。當從Interface Builder設置UIImageView的圖像時,該圖像如何加載?
編輯:我試圖調整任何方法被調用(如果可能)以後動態替換資產。
無的UIImage
初始化程序或工廠正在調用。
我用調試器(在iOS模擬器7.0.3)做了一些研究,發現如下:
1)UIImageView
在IB中設置的是通過-initWithCoder:
初始化的。
2)在initWithCoder:
方法decodeObjectForKey:
被調用。和(!)鍵名爲UIImage
包含來自IB的圖像。此圖像通過ivar設置爲UIImageView
,而不是通過setImage:
設置。
因此,似乎在編譯時IB會將原始圖像數據打包到XIB/Storyboard中。胡說八道,但是確實如此。
這就是爲什麼我們不能調酒+imageNamed:
或一些其他工廠,應該使用條件代碼來設置圖像的retina4和iOS6的
編輯:
評論顯示編譯IB的文件,它hexdumping已經爲png名內。
事實上,尋找的輸出 「進制打印-C BYZ-38-t0r - 視圖 - 8bC-XF-vdC.nib」 表示 PNG的文件名顯示在編譯的文件。因此,它必須通過相同包中的文件名加載文件數據 。
然而,他們仍然通過一些內部機制加載,而不是通過imageNamed:
的iOS會自動爲你尋找文件overflow.png
在同捆爲您的XIB文件。如果你的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;
豈不只是相對於視圖控制器是捆綁? – borrrden
也許它調用[UIImage imageNamed:]?我不是一個忍者忍者,所以我不知道你是如何覆蓋它的。 – morningstar
不錯的猜測,但它似乎並沒有使用該方法。 – kasrak