2013-06-04 59 views
9

當從屬性檢查器中預設圖像視圖的源時,文件的實際路徑何時/如何解析?似乎沒有任何呼叫NSBundle,但我可能是錯的。當從Interface Builder設置UIImageView的圖像時,該圖像如何加載?

編輯:我試圖調整任何方法被調用(如果可能)以後動態替換資產。

enter image description here

+1

豈不只是相對於視圖控制器是捆綁? – borrrden

+1

也許它調用[UIImage imageNamed:]?我不是一個忍者忍者,所以我不知道你是如何覆蓋它的。 – morningstar

+0

不錯的猜測,但它似乎並沒有使用該方法。 – kasrak

回答

9

無的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:

+0

是的...所以有沒有辦法改變像imageNamed一些方法? – jerrygdm

+0

你可以調整它,但對於這個特定的任務,你將無法獲得利潤 –

+1

關於「IB將原始圖像數據打包到XIB中」的評論沒有任何意義。我只看了一個已編譯的故事板,發現圖像數據沒有內聯到輸出文件BYZ-38-t0r-view-8bC-Xf-vdC.nib中。實際上,查看「hexdump -C BYZ-38-t0r-view-8bC-Xf-vdC.nib」的輸出表明PNG的文件名出現在編譯的文件中。所以,它必須通過同一個包中的文件名來加載文件數據。 – MoDJ

2

的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; 
+0

是的,但沒有任何所謂的獲取方法路徑? (見我編輯的動機)。 – kasrak

+0

@kasrak,你想要的圖像overflow.png的路徑?它是否在主包中? –

+0

我不認爲我是很清楚的。我想知道當它從故事板/ xib中加載它時,運行時如何實際初始化UIImageView。這將允許自動替換應用程序中的圖像,而無需更改任何代碼。 – kasrak

相關問題