AVCaptureVideoPreviewLayer doesn't fill up whole iPhone 4S Screen
Maybe this solves it?
CGRect bounds=view.layer.bounds;
avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
avLayer.bounds=bounds;
avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
One potential cause of confusion is that the AVCaptureVideoPreviewLayer
is a CoreAnimation layer and in all of the answers above is being positioned statically (e.g. without constraints) relative a view. If you use constraints to layout the view, these don't automatically resize the preview layer.
This means that you cannot set up the preview layer in viewDidLoad
as the layout has not yet taken place and the preview layer will sized how it was in Interface Builder.
Instead, override viewDidLayoutSubviews
on your ViewController
and position the preview layer there.
- (void)viewDidLayoutSubviews
{
CGRect bounds=view.layer.bounds;
avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
avLayer.bounds=bounds;
avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
}
@fitzwald's answer will give you the desired result, but there is an easier way. What is happening is that the session preset defaults to Video - High (which doesn't match the aspect ratio of the screen). A full screen preview (like in Camera.app) can be achieved by using the Photo preset. Simply set
session.sessionPreset = AVCaptureSessionPresetPhoto;
before you start your session. Here's the Apple Documentation if you want to learn more.