Search code examples
iosobjective-cgradientlayoutsubviews

How to use CAGradientLayer in layoutSubview by changing orientation


I have created a CAGradientLayer in a layoutSubview. This works, but if I change orientation it seems that the old frame doesn't disappear.

- (void) layoutSubviews
{ 
    CAGradientLayer *bgLayer = [GradientClass getGradient];
    bgLayer.frame = [[self.subviews objectAtIndex:0] frame];
    [self.layer insertSublayer:bgLayer atIndex:0];
}

Solution

  • Thats because layoutSubviews is called again when you rotate the device, causing a second CAGradientLayer to be created.

    All you should need to do is just keep a reference to your CAGradientLayer and just modify its frame.

    // Define bgLayer in your interface
    @property (strong, nonatomic) CAGradientLayer *bgLayer;
    
    - (void) layoutSubviews
    { 
        if (!self.bgLayer) {
            self.bgLayer = [GradientClass getGradient];
            [self.layer insertSublayer:bgLayer atIndex:0];
        }
    
        self.bgLayer.frame = [[self.subviews objectAtIndex:0] frame];
    }