2009-09-10 138 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