Search code examples
iosxcode4uiimageviewcalayerlayer

CALayer Troubles when loading an image from a UIImagePicker


I have a UIViewController with a UIImageView (imageView), and I'm defining several layers that will be nested in the imageview as follows in viewDidLoad:

//container layer - the very top layer
CALayer *containerLayer = [CALayer layer];
containerLayer.opacity = 0;
containerLayer.bounds = [self.imageView.layer frame];

// Holder Layer
CALayer *holderLayer = [CALayer layer];
holderLayer.opacity = 0;
holderLayer.bounds = self.imageView.bounds;

// Hierarchy layers
[containerLayer setValue:holderLayer forKey:@"__holderLayer"];
[containerLayer addSublayer:holderLayer];

[self.imageView.layer addSublayer:containerLayer];

I have the following code that works when loading an image from a UIImagePicker :

    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    UIImageView *newImgView = [[UIImageView alloc] initWithFrame:self.imageView.frame];

    CGRect frame = self.imageView.frame;

    newImgView.image = image;
    frame.origin = CGPointMake(0, 0);
    newImgView.layer.frame = frame;
    newImgView.layer.opacity = .9;
    newImgView.layer.contentsGravity = kCAGravityResizeAspectFill;

    CALayer * containerLayer = self.imageView.layer.sublayers[0];

    if (containerLayer != nil)
    {

        [containerLayer setValue:newImgView.layer forKey:@"__imageLayer"];


        CALayer * holderLayer = [containerLayer valueForKey:@"__holderLayer"];
        if (holderLayer != nil)
        {
            //!!!!!line below doesn't work!!!
            //[holderLayer addSublayer:newImgView.layer];

            //line below works!
            [self.imageView.layer addSublayer:newImgView.layer];
        }   
    }
    [self.imageView setNeedsDisplay];
    [self checkAndPrintLayers];

so the first nested layer is containerLayer, then holderLayer, and I'm expecting to add various images as sublayers to the holderLayer and then manipulate it. However, calling

  [holderLayer addSublayer:newImgView.layer];

doesn't work; the imageView stays blank. However, calling

[self.imageView.layer addSublayer:newImgView.layer];

and adding a sublayer to the top layer works just dandy. Am I missing something obvious here? Would love any suggestions. thanks.


Solution

  • Because

    holderLayer and containerLayer are transparent (holderLayer.opacity = 0 / containerLayer.opacity = 0),

    Make it,

     //container layer - the very top layer
    CALayer *containerLayer = [CALayer layer];
    containerLayer.opacity = 1.0;
    containerLayer.bounds = [self.imageView.layer frame];
    
    // Holder Layer
    CALayer *holderLayer = [CALayer layer];
    holderLayer.opacity = 1.0;
    holderLayer.bounds = self.imageView.bounds;