Переход к контроллеру занимает 5-10 секунд для отображения - PullRequest
0 голосов
/ 10 июня 2018

Я пользуюсь swift 4, и у меня есть приложение, в котором люди могут открывать камеру своего телефона через мое приложение.У меня есть ViewController с именем CameraController, который имеет значение по умолчанию UIView, и у меня есть представление поверх этого, называемое CameraView, которое отображает камеру пользователя и другие кнопки поверх этого.

Когда я нажимаю одну из этих кнопок, я перехожу к другому контроллеру вида через переход (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)
    }
 }

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

В дополнение к ответ из Линдси Скотт :

    let backCamera: AVCaptureDevice? = AVCaptureDevice.default(AVCaptureDevice.DeviceType.builtInWideAngleCamera, for: AVMediaType.video, position: AVCaptureDevice.Position.back)

    guard let camera = backCamera, let deviceInput = try? AVCaptureDeviceInput(device: camera) else {
        self?.didReceive(captureSession: nil)
        return
    }

    DispatchQueue.global(qos: .userInitiated).async { [weak self] in
        let deviceOutput = AVCapturePhotoOutput()
        let cameraSession = AVCaptureSession()

        cameraSession.beginConfiguration()
        cameraSession.sessionPreset = .low
        if cameraSession.canAddInput(deviceInput) {
            cameraSession.addInput(deviceInput)
        }
        if cameraSession.canAddOutput(deviceOutput) {
            cameraSession.addOutput(deviceOutput)
        }
        cameraSession.commitConfiguration()
        cameraSession.startRunning()
        DispatchQueue.main.async {
            self?.didReceive(captureSession: cameraSession)
        }
    }

Xcode 10.0, Swift 4.2

0 голосов
/ 10 июня 2018

Вызов AVCaptureSession startRunning блокирует ваш главный поток, поэтому задержка.

Как говорится в startRunning() Apple Doc :

Метод startRunning () является блокирующим вызовом, который может занять некоторое время, поэтому вы должны выполнить настройку сеанса в последовательной очереди, чтобы основная очередь не блокировалась (что поддерживает отзывчивость пользовательского интерфейса).

...