2009-09-10 140 views
2

你能告訴我爲什麼這段代碼沒有顯示圖片嗎?爲什麼CALayer不顯示圖像?

CALayer *layerBack = [CALayer layer]; 

addedObject = [[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle] 
    pathForResource:[NSString stringWithFormat: @"%@%d", PREFIX, number] ofType:@"png"]]; 

layerBack.bounds=CGRectMake(0.0f,0.0f,selectedImage.size.height,selectedImage.size.width); 
layerBack.position=CGPointMake(200,200); 

layerBack.contents = (id)selectedImage.CGImage; 
// in theory I think this line should be equal to selectedImage.CGImage, but when I do that, Xcode shows me an error! 

[self.view.layer addSublayer:layerBack]; 

[layerBack display]; 

這石英的東西讓我瘋狂!請幫忙!

是的,圖像在那裏,正在工作,但我看到這個代碼後是一個空白的屏幕。

+0

你爲什麼不只是使用的意見,特別是和的UIImageView它的imageNamed方法,從而降低這個代碼大約三線? – mahboudz 2009-09-10 18:33:00

+0

,因爲我必須在最後將最終結果轉移到文件中,並且最後難以將轉換從UIView複製到CGLayers。 – SpaceDog 2009-09-10 22:34:55

回答

3

我假設這段代碼來自您的視圖控制器,並且它的視圖在此之前已經被正確構造(否則,您將發送消息到零)。另外,我假設以上addedObject,你的意思是selectedImage。即跳出我的一件事是

[layerBack display]; 

[layerBack setNeedsDisplay]; 

CALayer documentation,問候代替,以-display:

你不應該直接調用此方法 。

設置Core Animation Programming Guide的"Providing Layer Content"部分中的圖層內容更多。

+0

就是這樣! thankss !!!!!! – SpaceDog 2009-09-10 20:24:53

+2

David Duncan在cocoa-dev maillist上回答了這個問題: 默認情況下,這將刪除剛剛設置的內容。 調用-setNeedsDisplay或-display將導致圖層生成內容並將內容屬性設置爲該操作的結果。如果手動設置內容屬性,則不應該在該圖層上調用-setNeedsDisplay或-display,否則您設置的內容將會丟失。您可以通過實現一些委託方法或繼承一個CALayer來避免這種情況,但通常在完成此操作時保持對CALayer的控制權完全可以避免這個問題。 – 2009-12-23 00:52:48

2

首先,我認爲你必須將CGImage轉換爲一個id。

layerBack.contents = (id)selectedImage.CGImage; 

其次,我認爲你必須給圖層添加到的意見內容層

[self.view.layer addSublayer:layerBack]; 

但我一直利用我的自定義UIViews類的+(類)layerClass的;生成自己的子圖層佈局的自定義圖層,但也許這就是我。

+0

謝謝。我做了兩個更改,圖層仍然沒有顯示。如果我可以問,你能否隨時寄給我你創建的這個課程?如果可以的話,請郵寄到「utugau - > at < - gmail」...我所有的頭髮都變得灰白,絕望中用石英... – SpaceDog 2009-09-10 12:49:28

+0

我已經將你的建議添加到原始文章中,因爲我已經測試過他們和代碼仍然沒有顯示任何內容。 – SpaceDog 2009-09-10 13:44:25

1

什麼是selectedImage,它與addedObject有什麼關係?從我看到的,你得到一個圖像,但是然後添加一個完全不同的,不相關的圖像,可能是一個空白的圖像。

你注意Xcode提供給你的消息嗎?

+0

addObject是一個錯字,當我將代碼複製到SO ...因爲我在這裏輸入代碼時改變了一些變量來澄清...感謝您的幫助。 – SpaceDog 2009-09-10 20:24:17

1

大橋是:

layerBack.contents = (__bridge id)selectedImage.CGImage; 
+0

你能解釋一下這個橋牌號是什麼嗎?謝謝。 – SpaceDog 2011-09-25 16:51:04

+0

'(__bridge id)'用於Cocoa相當新的ARC(自動引用計數),用於在Cocoa和Core基礎之間(或者通常:C)之間傳輸對象,更多信息請參見Apple官方文檔或[this](http ://www.mikeash.com/pyblog/friday-qa-2011-09-30-automatic-reference-counting.html)Mike Ash的博客文章。 – Regexident 2012-02-14 00:36:08