【发布时间】:2018-06-10 00:27:41
【问题描述】:
我正在使用 swift 4 并且有一个应用程序,人们可以通过我的应用程序打开他们的手机摄像头。我有一个名为CameraController 的ViewController,它具有默认的UIView,并且我有一个名为CameraView 的视图,它在其上显示用户相机和其他按钮。
当我单击其中一个按钮时,它会通过 segue (PlacesController) 将我带到另一个视图控制器。当我关闭PlacesController 时,我会返回CameraController,但是子视图现在需要大约 8 或 10 秒才能再次显示。
有没有什么方法可以在保持当前子视图的同时转到另一个控制器?
同样的问题是,当我转到我的 segue 控制器 PlaceController 然后再回到我的 CameraController 时,相机和子层变得可见大约需要 8 或 10 秒。特别是下面的这段代码,我想知道是否可以让我的子层继续运行,因为等待 10 秒才能显示太多。
self.CameraView.layer.insertSublayer(previewLayer!, at: 0)
这是我的代码:
class CameraController: UIViewController {
@IBOutlet weak var CameraView: UIView!
var previewLayer: AVCaptureVideoPreviewLayer?
let captureSession = AVCaptureSession()
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(_ animated: Bool) {
DispatchQueue.main.async {
self.beginSession()
}
func beginSession() {
// gets the camera showing and displays buttons on top of it
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
self.CameraView.layer.insertSublayer(previewLayer!, at: 0)
previewLayer?.frame = self.CameraView.layer.bounds
previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
captureSession.startRunning()
stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecType.jpeg]
if captureSession.canAddOutput(stillImageOutput) {
captureSession.addOutput(stillImageOutput)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "PlacesController" {
let PlaceAreaSearchC: ColorC = segue.destination as! PlacesController
PlaceAreaSearchC.delegate = self
}
}
// PlacesController
class PlacesController: UIViewController {
@IBAction func backAction(_ sender: Any) {
// This is how I go back to my view CameraController
dismiss(animated: true, completion: nil)
}
}
【问题讨论】:
-
使用 Instruments 尝试缩小您的问题范围。
-
为您的 beginSession 使用不同的线程怎么样?您现在正在做的是在主 GUI 线程上运行它(...您对当前 IMPL 所做的只是将其移动到主队列的末尾,但它仍在 GUI 的队列中)。如果你尝试这个会发生什么?
标签: ios swift camera segue avcapturesession