gpt4 book ai didi

objective-c - 使用现有 View 作为UIImagePickerController的cameraOverlayView

转载 作者:行者123 更新时间:2023-11-30 14:15:11 24 4
gpt4 key购买 nike

我有一个 ScrollView ,内容顶部有一个透明的开口。开场从银幕外开始。 (黑色矩形代表设备窗口):

enter image description here

当 ScrollView 开始向下滚动时,我想启动设备的相机,图像选择器 View 位于 ScrollView 后面:

enter image description here

ScrollView 将锁定到位,如下所示:

enter image description here

透明打开和 ScrollView 行为没有问题。我还成功地呈现了一个带有自定义覆盖层的 UIImagePickerController,该覆盖层还不是屏幕上的 ScrollView 。

我似乎无法弄清楚如何在现有内容后面呈现图像选择器的 View ,如上面模拟的那样。

最佳答案

经过几个小时的额外研究,我得出的结论是,使用 UIImagePickerController 不可能实现我想要的功能。。然而,深入了解框架堆栈,我发现了更强大(如果更复杂)的 AVCaptureSession。

解决方案概述

根据标题为“在 iOS 5 上使用 AV Foundation 从相机捕获”的 WWDC 视频,我编写了一个名为 VideoCaptureView 的类,它封装了方程的输入和相机预览部分。然后我在“舷窗” View 后面打了一个空白的 UIView,它提供了圆角矩形 mask ,并使该 UIView 成为 VideoCaptureView 的子类。使用 View Controller 中的 socket ,当 ScrollView 将舷窗移动到位时,我调用 captureView.beginCapture() 。 (尚未处理停止视频捕获的问题……这是读者的练习。)

代码

对于其他感兴趣的人,这是我当前的 VideoCaptureView 实现......也在 GitHub 上作为 gist .

import UIKit
import AVFoundation

typealias VideoCaptureFailure = String

class VideoCaptureView: UIView {

var videoDataCaptureDelegate: AVCaptureVideoDataOutputSampleBufferDelegate?

private var previewLayer: AVCaptureVideoPreviewLayer?
private lazy var captureSession:AVCaptureSession = {
let session = AVCaptureSession()
print("created capture session: \(session)".emphasizeForLogging())
session.sessionPreset = AVCaptureSessionPresetPhoto
return session
}()

func beginCapture() -> VideoCaptureFailure? {

print("Stopping session: \(captureSession)".emphasizeForLogging())
captureSession.stopRunning()

if let device = captureDevice() {
var err : NSError? = nil

if captureSession.inputs.isEmpty {
captureSession.addInput(AVCaptureDeviceInput(device: device, error: &err))
}

if captureSession.outputs.isEmpty {
assert(videoDataCaptureDelegate != nil, "Hey, you forgot to hook up the damn delegate!")
let output = AVCaptureVideoDataOutput()
captureSession.addOutput(output)
let serial_queue = dispatch_queue_create("smilesVideoOutputQueue", nil)
output.setSampleBufferDelegate(videoDataCaptureDelegate, queue: serial_queue)
}

if err != nil {
println("error: \(err?.localizedDescription)".emphasizeForLogging())
}
if previewLayer == nil {
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
self.layer.addSublayer(previewLayer)
previewLayer?.frame = self.layer.frame
}
captureSession.startRunning()
return nil // Success.
} else { return "No capture device available" }
}

private func captureDevice() -> AVCaptureDevice? {
// Make sure this particular device supports video
for device in AVCaptureDevice.devices() {
if device.hasMediaType(AVMediaTypeVideo) {
if device.position == .Front {
return device as? AVCaptureDevice
}
}
}
return nil
}
}

关于objective-c - 使用现有 View 作为UIImagePickerController的cameraOverlayView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31277945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com