29
votes

I've got a view controller in my storyboard with several UIButtons. One of them activates an AVFoundation camera preview layer shown in a sublayer:

captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
captureVideoPreviewLayer.frame = self.view.bounds;
[self.view.layer addSublayer:captureVideoPreviewLayer];

This works correctly except for the fact that the preview layer is rendered on top of my buttons so even though the buttons are still clickable they are not able to be seen by the user. Is there an easy way to place the sublayer below the buttons? Or an easy way to raise the buttons up in the layer? Thank you much!

2

2 Answers

55
votes

The button layers are all sublayers of the main view's layers. You'll need to put your camera preview layer below the button's layers. Try this:

// put it behind all other subviews
[self.view.layer insertSublayer:captureVideoPreviewLayer atIndex:0];

// or, put it underneath your buttons, as long as you know which one is the lowest subview
[self.view.layer insertSublayer:captureVideoPreviewLayer below:lowestButtonView.layer];
3
votes

Just to add. You can raise any subclass of UIView up in the layer by calling UIView method bringSubviewToFront.

[self.view bringSubviewToFront:self.desiredButton];