iOS 相机视野间歇性地以黑色打开
iOS camera view opening up at black intermittently
我有一个 viewcontroller,它有一个调用第二个 viewcontroller 的按钮,它添加了一个视频子层并调用了相机。
在我尝试向第二个 viewcontroller 添加其他按钮(例如另一个按钮)之前,该代码一直运行良好,然后,它有时会工作,有时会不工作。
"not work" 我的意思是它会打开一个黑屏,什么也没有。没有任何反应。
我删除了按钮/代码等,但没有解决任何问题。
似乎有时它会起作用。 IE。工作后我可以添加一个按钮或更改代码,它会工作,然后它会再次显示黑屏。
没有构建错误和跟踪,它基本上是坐在那里等我做某事(比如按下记录按钮)但没有任何显示。
我读到我应该 "bringsubviewtofront" 但这似乎没有任何作用。
有什么建议吗?
提前致谢。
更新:我想我找到了一些相关的东西。我试图使用 CGRect 以编程方式在屏幕上定位一个按钮,其中一部分涉及获取文本视图的宽度和高度。
我发现代码因 "expected to find optional value but found nil" 消息而崩溃,即我无法执行以下操作:textView.frame.width、textView.frame.height、textView.translatesAutoresizingMaskIntoConstraints = false 等
起初我以为这是我的代码,但在使用相同代码在另一个 VC 上尝试后,它突然又开始工作了,即我得到了 textView.frame.width 和 [=44= 的值].
我的相机开始显示预览!
所以我估计当预览是黑色的时候,我的按钮和文本视图就没有值了。
let captureSession = AVCaptureSession()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
captureSession.sessionPreset = AVCaptureSession.Preset.high
// loop through all devices looking for cameras
let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified)
let devices = deviceDiscoverySession.devices
for device in devices {
if (device.hasMediaType(AVMediaType.video)) {
if device.position == AVCaptureDevice.Position.back {
backCamera = device
} else if device.position == AVCaptureDevice.Position.front {
frontCamera = device
}
}
}
currentDevice = frontCamera
// look through all devices looking for microphone
let audioDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInMicrophone], mediaType: AVMediaType.audio, position: AVCaptureDevice.Position.unspecified)
let audioDevices = audioDiscoverySession.devices
for audioDevice in audioDevices {
if (audioDevice.hasMediaType(AVMediaType.audio)) {
audioCapture = audioDevice
}
}
// set up input output
do {
// setup camera input
let captureDeviceInput = try AVCaptureDeviceInput(device: currentDevice!)
captureSession.addInput(captureDeviceInput)
// setup audio input
let captureDeviceAudio = try AVCaptureDeviceInput(device: audioCapture!)
captureSession.addInput(captureDeviceAudio)
videoFileOutput = AVCaptureMovieFileOutput()
captureSession.addOutput(videoFileOutput!)
} catch {
print(error)
}
cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
cameraPreviewLayer?.connection?.videoOrientation = currentVideoOrientation()
cameraPreviewLayer?.frame = self.view.frame
self.view.layer.insertSublayer(cameraPreviewLayer!, at: 0)
captureSession.startRunning()
}
检查您是否提供了代码来请求您的应用程序访问相机的权限。如果您添加了代码但不允许应用程序在请求许可时访问相机,则进入设置 > 应用程序名称 > 相机并打开访问权限。如果不添加:
//Permission for Camera
AVCaptureDevice.requestAccess(for: AVMediaType.video) { response in
if response {
//access granted
} else {
//Take required action
}
}
好的,我知道如何解决它,但我不知道它为什么会这样,除了它是 Xcode 中的一个错误。
看来问题与视频子层及其代码无关。
我在此 ViewController 上有文本视图和按钮等。
我发现如果我更改按钮或 TextView 的大小,例如增加和减少文本视图的大小,然后问题就消失了。
如果您随后更改某些内容,例如代码或四处移动按钮等,但如果您返回文本视图并更改大小,那么它将再次起作用。
这是解决方法,但我不知道是什么触发了这个问题。
我有一个 viewcontroller,它有一个调用第二个 viewcontroller 的按钮,它添加了一个视频子层并调用了相机。
在我尝试向第二个 viewcontroller 添加其他按钮(例如另一个按钮)之前,该代码一直运行良好,然后,它有时会工作,有时会不工作。
"not work" 我的意思是它会打开一个黑屏,什么也没有。没有任何反应。
我删除了按钮/代码等,但没有解决任何问题。
似乎有时它会起作用。 IE。工作后我可以添加一个按钮或更改代码,它会工作,然后它会再次显示黑屏。
没有构建错误和跟踪,它基本上是坐在那里等我做某事(比如按下记录按钮)但没有任何显示。
我读到我应该 "bringsubviewtofront" 但这似乎没有任何作用。
有什么建议吗?
提前致谢。
更新:我想我找到了一些相关的东西。我试图使用 CGRect 以编程方式在屏幕上定位一个按钮,其中一部分涉及获取文本视图的宽度和高度。
我发现代码因 "expected to find optional value but found nil" 消息而崩溃,即我无法执行以下操作:textView.frame.width、textView.frame.height、textView.translatesAutoresizingMaskIntoConstraints = false 等
起初我以为这是我的代码,但在使用相同代码在另一个 VC 上尝试后,它突然又开始工作了,即我得到了 textView.frame.width 和 [=44= 的值].
我的相机开始显示预览!
所以我估计当预览是黑色的时候,我的按钮和文本视图就没有值了。
let captureSession = AVCaptureSession()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
captureSession.sessionPreset = AVCaptureSession.Preset.high
// loop through all devices looking for cameras
let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified)
let devices = deviceDiscoverySession.devices
for device in devices {
if (device.hasMediaType(AVMediaType.video)) {
if device.position == AVCaptureDevice.Position.back {
backCamera = device
} else if device.position == AVCaptureDevice.Position.front {
frontCamera = device
}
}
}
currentDevice = frontCamera
// look through all devices looking for microphone
let audioDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInMicrophone], mediaType: AVMediaType.audio, position: AVCaptureDevice.Position.unspecified)
let audioDevices = audioDiscoverySession.devices
for audioDevice in audioDevices {
if (audioDevice.hasMediaType(AVMediaType.audio)) {
audioCapture = audioDevice
}
}
// set up input output
do {
// setup camera input
let captureDeviceInput = try AVCaptureDeviceInput(device: currentDevice!)
captureSession.addInput(captureDeviceInput)
// setup audio input
let captureDeviceAudio = try AVCaptureDeviceInput(device: audioCapture!)
captureSession.addInput(captureDeviceAudio)
videoFileOutput = AVCaptureMovieFileOutput()
captureSession.addOutput(videoFileOutput!)
} catch {
print(error)
}
cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
cameraPreviewLayer?.connection?.videoOrientation = currentVideoOrientation()
cameraPreviewLayer?.frame = self.view.frame
self.view.layer.insertSublayer(cameraPreviewLayer!, at: 0)
captureSession.startRunning()
}
检查您是否提供了代码来请求您的应用程序访问相机的权限。如果您添加了代码但不允许应用程序在请求许可时访问相机,则进入设置 > 应用程序名称 > 相机并打开访问权限。如果不添加:
//Permission for Camera
AVCaptureDevice.requestAccess(for: AVMediaType.video) { response in
if response {
//access granted
} else {
//Take required action
}
}
好的,我知道如何解决它,但我不知道它为什么会这样,除了它是 Xcode 中的一个错误。
看来问题与视频子层及其代码无关。
我在此 ViewController 上有文本视图和按钮等。
我发现如果我更改按钮或 TextView 的大小,例如增加和减少文本视图的大小,然后问题就消失了。
如果您随后更改某些内容,例如代码或四处移动按钮等,但如果您返回文本视图并更改大小,那么它将再次起作用。
这是解决方法,但我不知道是什么触发了这个问题。