2015-04-09 4 views
15

Я не знаю, является ли эта проблема чем-то вроде автоматического макета, или я делаю что-то неправильно.
У меня есть 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() 
+0

Это работало для вас? – Erik

+0

№ Когда я перемещаю код в viewdidlayoutsubviews, он вообще не работает. На вид у меня есть uiview и tableciew. И это швы, что автоопределение как-то увеличивает высоту uiview, и поэтому Camera не такой же размер, как uiview. Я не знаю, как с этим справиться. – 1110

+0

Пожалуйста, предоставьте мне больше кода, чтобы помочь диагностировать это. – Erik

ответ

10

Вам необходимо провести установку после ваших подвиды изложил. В viewDidLayoutSubviews

Add view

Add outlet

Add Constraints

-(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]; 
} 

Что, вероятно, происходит с вами в том, что границы не были точно еще установлены в вашем 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() 
0

Если вы хотите, чтобы ваш слой, чтобы заполнить UIView правильно, вы можете также определить ограничения для него :

self.camView.layer.addSublayer(previewLayer) 
self.camView.layer.layoutManager = CAConstraintLayoutManager.layoutManager(); 
self.camView.layer.addConstraint(CAConstraint.constraintWithAttribute(CAConstraintAttribute.MinX, relativeTo: self.camView.layer, attribute: CAConstraintAttribute.MinX, scale: 1, offset: 0)); 
self.camView.layer.addConstraint(CAConstraint.constraintWithAttribute(CAConstraintAttribute.MaxX, relativeTo: self.camView.layer, attribute: CAConstraintAttribute.MaxX, scale: 1, offset: 0)); 
self.camView.layer.addConstraint(CAConstraint.constraintWithAttribute(CAConstraintAttribute.Width, relativeTo: self.camView.layer, attribute: CAConstraintAttribute.Width, scale: 1, offset: 0)); 
self.camView.layer.addConstraint(CAConstraint.constraintWithAttribute(CAConstraintAttribute.Height, relativeTo: self.camView.layer, attribute: CAConstraintAttribute.Height, scale: 1, offset: 0)); 
session.startRunning() 
-2

Если вы используете autolayout то просто сделать:

  1. S и др ваш вид камеры х = 0 и размер экрана
  2. Нанести ведущую и ведомое ограничение на SuperView

Надеется, что это поможет вам.

+0

Правильно отформатируйте сообщение. – Xan

0

Чтобы установить ограничения priviewLayer, как показано ниже, чтобы он занял весь экран.

Leading Space = 0 from mainView 
Top Space = 0 from mainView 
Bottom Space = 0 from mainView 
Trailing Space = 0 from mainView 

Надеюсь, это поможет вам.

Смежные вопросы