AVCaptureVideoPreviewLayer 看起来是 iPhone 4 大小
AVCaptureVideoPreviewLayer looks to be iPhone 4 size
我正在使用此代码在我的 iOS 9,Swift 应用程序中显示摄像头:
属性:
@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
}
但是,相机显示是这样的:
它似乎相当于 iPhone 4.
的显示大小
我该如何解决这个问题?我已经尝试在 viewDidLayoutSubviews
中设置框架,但我无法正确调整它的大小。
检查您是否为所有支持的设备分配了启动图像。如果不是,那么 iOS 将默认为该大小,无论您做什么。
您不必重写 layoutSubivews 或 viewDidLayoutSUbviews 方法。
- 确保
previewView
被限制为 superview
(如果您使用的是自动版式)
- 确保
previewLayer
的边界与 previewView
bounds
相同。不要在将帧值赋予边界或将绑定值赋予框架时感到困惑。
- 设置预览图层的视频重力为
AVLayerVideoGravityResizeAspectFill
。
4.You 可以定位 previewLayer
并使其居中于 previewView
。使用 previewLayer
的位置 属性 并将其设置为 previewView
.
的中心
- 在
viewDidAppear
/viewWillAppear
中调用 setupSession()
我正在使用此代码在我的 iOS 9,Swift 应用程序中显示摄像头:
属性:
@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
}
但是,相机显示是这样的:
它似乎相当于 iPhone 4.
的显示大小我该如何解决这个问题?我已经尝试在 viewDidLayoutSubviews
中设置框架,但我无法正确调整它的大小。
检查您是否为所有支持的设备分配了启动图像。如果不是,那么 iOS 将默认为该大小,无论您做什么。
您不必重写 layoutSubivews 或 viewDidLayoutSUbviews 方法。
- 确保
previewView
被限制为superview
(如果您使用的是自动版式) - 确保
previewLayer
的边界与previewView
bounds
相同。不要在将帧值赋予边界或将绑定值赋予框架时感到困惑。 - 设置预览图层的视频重力为
AVLayerVideoGravityResizeAspectFill
。
4.You 可以定位 previewLayer
并使其居中于 previewView
。使用 previewLayer
的位置 属性 并将其设置为 previewView
.
- 在
viewDidAppear
/viewWillAppear
中调用
setupSession()