2015-04-09 12 views
15

Non so se questo problema riguardi il layout automatico o sto facendo qualcosa di sbagliato.
Ho un UIViewController e uno UIView al suo interno.
E sto usando AVCaptureSession per mettere la vista della telecamera al suo interno.
Il problema è che quando la vista della telecamera viene caricata all'interno della vista, non riempie quella vista, quindi ho degli spazi vuoti sul lato sinistro e destro.
Quello che sto cercando di fare è riempire l'intero UIView con la fotocamera.
Questo è il mio codice:
Come impostare la vista della telecamera per riempire la vista principale

... 
@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

Ha funzionato per voi? – Erik

+0

No. Quando sposto il codice per viewdidlayoutsubviews non funziona affatto. Dal punto di vista ho uiview e tableciew muggito. E questo giustifica l'aumento automatico in qualche modo della sua altezza e questo è il motivo per cui la fotocamera non ha le stesse dimensioni di uiview. Non so come gestirlo. – 1110

+0

Forniscimi più codice per diagnosticare ciò. – Erik

risposta

10

, è necessario eseguire l'impostazione dopo i vostri subviews vengono spiegate. In 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]; 
} 

Quello che probabilmente ti succede è che i limiti non sono stati accuratamente ancora impostato nel vostro viewDidLoad le subviews devono ancora essere stabilite fuori secondo i loro vincoli. Quando si imposta invece il frame per lo previewLayer in viewDidLayoutSubviews, verrà adottato l'orientamento corretto. Attenzione però, dovrai anche regolare l'anteprima a rotazione e cosa no e modificare il codice che ho usato. Spiacente, non è veloce, ma non dovrebbe essere importante. Basta spostare l'esemplificazione e la configurazione in viewDidLayoutSubviews

Così, per il codice, si dovrebbe fare qualcosa di simile:

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

Se volete che il vostro livello per riempire l'UIView correttamente, si potrebbe anche definire i vincoli per esso :

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

Se si sta utilizzando layout automatico poi basta fare:

  1. S et la tua telecamera x = 0 e con alle dimensioni dello schermo
  2. Applicare iniziali e finali vincolo di Superview

Spero che questo vi aiuterà.

+0

Si prega di formattare il tuo messaggio correttamente. – Xan

0

Per impostare i vincoli priviewLayer come il seguente codice, in modo che occupi tutto lo schermo.

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

Spero che questo ti aiuti.

Problemi correlati