views:

692

answers:

3

Can you guys tell why this code shows no image?

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];

This Quartz stuff is driving me crazy! Please help!

Yes, the image is there and is working, but all I see after this code is a blank screen.

+1  A: 

Well first of all I think you have to cast the CGImage to an id.

layerBack.contents = (id)selectedImage.CGImage;

And secondly, I think you have to add the layer to the views content layer

[self.view.layer addSublayer:layerBack];

But I have always made use of my custom UIViews class's + (Class)layerClass; to generate custom layers which layout their own sublayers, but maybe that's just me.

Glenn Howes
Thanks. I did both changes and the layer is still not showing. If I may ask, can you, by any chance, kindly send me this class you've created? If you can, please mail it to "utugau-->at<--gmail"... All my hair is turning gray in despair with quartz...
Digital Robot
I have added your suggestions to the original post because I have tested with them and the code is still not showing any content.
Digital Robot
A: 

I assume that this code is from your view controller and that its view has been properly constructed before this (otherwise, you'll be sending messages to nil). Also, I assume by addedObject above, you mean selectedImage. One thing that jumps out at me is that

[layerBack display];

should be replaced with

[layerBack setNeedsDisplay];

From the CALayer documentation, in regards to -display:

You should not call this method directly.

There's more on setting the content of layers like this in the "Providing Layer Content" section of the Core Animation Programming Guide.

Brad Larson
that's it! thankss!!!!!!
Digital Robot
David Duncan answered this on cocoa-dev maillist:By default this will obliterate the contents that you have just set.Calling -setNeedsDisplay or -display will cause the layer to generate content and set the contents property to the result of that operation. If you set the contents property manually, you should never call -setNeedsDisplay or -display on that layer or the content you set will be lost. You can avoid this by implementing some delegate methods or subclassing a CALayer, but it is generally easier to avoid the issue entirely by maintaining control over the CALayer when doing this.
Johan Kool
+1  A: 

What is selectedImage and how does it relate to addedObject? From what I see, you get an image, but then add in an entirely different, unrelated image, possibly a blank one, to the layer.

Are you paying attention to messages Xcode is providing you?

mahboudz
that addObject was a typo when I copied the code to SO... as I changed a few variables when typing the code here to clarify...thanks for the help.
Digital Robot