【问题标题】:iOS camera view opening up at black intermittentlyiOS相机视图间歇性地以黑色打开
【发布时间】:2018-02-17 23:22:42
【问题描述】:

我有一个视图控制器,它有一个调用第二个视图控制器的按钮,它添加一个视频子层并调用相机。

在我尝试向第二个视图控制器添加其他按钮(例如另一个按钮)之前,代码一直运行良好,然后,它有时会工作,有时会不工作。

“不工作”是指它会打开一个黑屏,什么都没有。不响应任何内容。

我已经删除了按钮/代码等,但它没有修复任何东西。

它似乎有时会起作用。 IE。在它工作之后,我可以添加一个按钮或更改代码,它会工作,然后它会再次显示黑屏。

没有构建错误和跟踪,它基本上就坐在那里等我做某事(比如按下录制按钮),但什么也没显示。

我读到我应该“将subviewtofront”,但这似乎没有任何作用。

有什么建议吗?

提前致谢。

更新:我想我发现了一些相关的东西。我试图使用 CGRect 以编程方式在屏幕上定位一个按钮,其中一部分涉及获取文本视图的宽度和高度。

我发现代码因“期望找到可选值但发现为零”消息而崩溃,即我无法执行以下操作:textView.frame.width、textView.frame.height、textView.translatesAutoresizingMaskIntoConstraints = false 等。

起初我以为这是我的代码,但在使用相同代码在另一个 VC 上尝试后,它突然又开始工作了,即我得到了 textView.frame.width 和 textView.frame.height 的值。

我的相机开始显示预览!

所以我估计当预览为黑色时,我的按钮和文本视图没有值。

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()

}

【问题讨论】:

  • 您可以添加一些代码以提供更多上下文吗?
  • 尝试使用 viewDidAppear 准备相机。
  • 准备好所有代码都在里面吗?
  • 没有区别。 viewDidAppear 正在触发,但屏幕仍然是黑色的。 ☹️

标签: ios swift avcam


【解决方案1】:

好的,我知道如何解决它,但我不知道它为什么会这样,除了它是 Xcode 中的一个错误。

看来问题与视频子层及其代码无关。

我在这个 ViewController 上有文本视图和按钮等。

我发现如果我更改按钮或 TextView 的大小,例如增加和减少文本视图的大小,然后问题就消失了。

如果您随后更改某些内容(例如代码或移动按钮等,但如果您返回文本视图并更改大小,那么它将再次起作用。

这是解决方法,但我不知道是什么触发了这个问题。

【讨论】:

    【解决方案2】:

    检查您是否提供了代码来请求您的应用访问相机的权限。如果您添加了代码但不允许应用程序在请求权限时访问相机,则进入设置>应用程序名称>相机并打开访问权限。如果不添加:

    //Permission for Camera
    AVCaptureDevice.requestAccess(for: AVMediaType.video) { response in
        if response {
            //access granted
        } else {
           //Take required action
        }
    }
    

    【讨论】:

    • 一切就绪。它间歇性地发生,然后又开始工作了..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多