111*_*110 18 uiview ios avcapturesession swift ios8
我不知道这个问题是关于自动布局还是我做错了什么.
我有一个UIViewController
和一个UIView
内部.
而我正在使用AVCaptureSession
相机视图.
问题是,当我在摄像机视图中加载视图时,它不会填充该视图,所以我在左侧和右侧有间隙.
我要做的是UIView
用相机填满整个.
这是我的代码:
...
@IBOutlet weak var camView: UIView!
var previewLayer : AVCaptureVideoPreviewLayer!
override func viewDidLoad() {
...
previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as! AVCaptureVideoPreviewLayer
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer.frame = self.camView.layer.bounds
self.camView.layer.addSublayer(previewLayer)
session.startRunning()
Run Code Online (Sandbox Code Playgroud)
Eri*_*rik 17
布局子视图后,您需要进行设置.在viewDidLayoutSubviews
-(void)viewDidLayoutSubviews
{
[self setupAVCapture];
}
- (void)setupAVCapture {
NSError *error = nil;
AVCaptureSession *session = [AVCaptureSession new];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
[session setSessionPreset:AVCaptureSessionPreset640x480];
else
[session setSessionPreset:AVCaptureSessionPresetPhoto];
// Select a video device, make an input
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if ([session canAddInput:deviceInput])
[session addInput:deviceInput];
AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];
[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
previewLayer.frame = self.camView.bounds;
[self.camView.layer addSublayer:previewLayer];
[session startRunning];
}
Run Code Online (Sandbox Code Playgroud)
你可能发生的事情是你的界限还没有准确设置,viewDidLoad
因为子视图还没有根据他们的约束进行布局.当您改为设置框架previewLayer
时viewDidLayoutSubviews
,它将采用正确的方向.但要小心,你还需要调整旋转预览和不旋转预览,并修改我使用的代码.对不起它不是很快,但这不重要.只需将您的实例化和设置移动到viewDidLayoutSubviews
所以对于你的代码,你应该做这样的事情:
override func viewDidLayoutSubviews() {
...
previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as! AVCaptureVideoPreviewLayer
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer.frame = self.camView.layer.bounds
self.camView.layer.addSublayer(previewLayer)
session.startRunning()
Run Code Online (Sandbox Code Playgroud)