2016-06-07 65 views
1

我使用这个代码在我的iOS 9,斯威夫特显示手机相机:AVCaptureVideoPreviewLayer看起来是iPhone 4的尺寸

属性:

@IBOutlet weak var previewView: UIView! 

var session: AVCaptureSession! 
var input: AVCaptureDeviceInput! 
var output: AVCaptureStillImageOutput! 
var previewLayer: AVCaptureVideoPreviewLayer? 

委托方法:

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    setupSession() 
} 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    // Experimental/debugging 
    view.layoutSubviews() 
} 

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    // Experimental/debugging 
    previewLayer!.frame = previewView.bounds 
} 

相机方法:

func setupSession() { 
    session = AVCaptureSession() 
    session.sessionPreset = AVCaptureSessionPresetPhoto 

    let camera = frontCamera() 

    do { input = try AVCaptureDeviceInput(device: camera) } catch { return } 

    output = AVCaptureStillImageOutput() 
    output.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] 

    guard session.canAddInput(input) && session.canAddOutput(output) else { return } 

    session.addInput(input) 
    session.addOutput(output) 

    previewLayer = AVCaptureVideoPreviewLayer(session: session) 
    previewLayer!.videoGravity = AVLayerVideoGravityResizeAspect 
    previewLayer!.frame = previewView.bounds 
    previewLayer!.connection?.videoOrientation = .Portrait 

    previewView.layer.addSublayer(previewLayer!) 

    session.startRunning() 
} 

func frontCamera() -> AVCaptureDevice! { 
    let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) 
    for device in devices { 
     if (device.position == AVCaptureDevicePosition.Front) { 
      return device as! AVCaptureDevice 
     } 
    } 
    return nil 
} 

然而,相机显示如下:

enter image description here

,它似乎是等同于iPhone 4

我怎样才能解决这个问题的显示尺寸?我试过在viewDidLayoutSubviews中设置框架,但我无法正确设置它的大小。

回答

0

您不必重写layoutSubivews或viewDidLayoutSUbviews方法。

  1. 确保previewView被constrainted到superview(如果您正在使用自动版式)
  2. 确保的previewLayer的范围是相同previewViewbounds。不要混淆,而要将帧值限定为帧的边界或边界值。
  3. 设置预览图层的视频比重为AVLayerVideoGravityResizeAspectFill

4.您可以定位previewLayer并使其中心为previewView。使用位置属性previewLayer并将其设置为previewView的中心。

  • 呼叫setupSession()无论是在viewDidAppear/viewWillAppear
  • +0

    数3解决它,显然的最后四个字符 “填充” 并获得成功。谢谢! – Erik

    0

    检查是否为所有支持的设备分配了启动映像。如果不是,那么无论你做什么,iOS都会默认这个大小。

    相关问题