iPhone Xs. Почему при использовании AVCaptureVideoPreviewLayer между верхней границей моего UIView и верхней границей безопасной области возникает огромный отступ? - PullRequest
0 голосов
/ 28 ноября 2018

Я разрабатываю кастомную камеру на iphone Xs Max.Мой макет ниже.Единственные верхняя, левая, правая и нижняя границы UIView привязаны к безопасной области.Тем не менее, я вижу огромный черный промежуток между верхней границей моего вывода видеозахвата и верхней границей безопасного просмотра.Что это за черное пространство и как мне вычислить его высоту?

enter image description here

Макет:

enter image description here

enter image description here

UIView ограничения: enter image description here

код:

class NewCapturViewController: UIViewController, UIImagePickerControllerDelegate,AVCaptureVideoDataOutputSampleBufferDelegate  {

   var previewLayer = AVCaptureVideoPreviewLayer.init()
   var captureSession: AVCaptureSession!


   override func viewWillAppear(_ animated: Bool) {
       startAVCaptureSession()
   }


func startAVCaptureSession() {
    print("START CAPTURE SESSION!!")

    // Setting Up a Capture Session
    self.captureSession = AVCaptureSession()
    captureSession.beginConfiguration()

    // Configure input
    let videoDevice = AVCaptureDevice.default(for: .video)

    guard
        let videoDeviceInput = try? AVCaptureDeviceInput.init(device: videoDevice!) as AVCaptureInput,
        self.captureSession.canAddInput(videoDeviceInput)else {return}

    self.captureSession.addInput(videoDeviceInput)

    // Capture video output
    let videoOutput = AVCaptureVideoDataOutput.init()
    guard self.captureSession.canAddOutput(videoOutput) else {return}
    videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue.init(label: "videoQueue"))
    self.captureSession.addOutput(videoOutput)


    // start
    self.captureSession.commitConfiguration()
    self.captureSession.startRunning()


    // Display camera preview
    self.previewLayer = AVCaptureVideoPreviewLayer.init(session: self.captureSession)

    // Use 'insertSublayer' to enable button to be viewable
    self.camViewOutlet.layer.insertSublayer(self.previewLayer, at: 0)
    self.previewLayer.frame = self.camViewOutlet.frame
    self.previewFrame = previewLayer.frame


    print("previewLayer.frame: \(previewLayer.frame)")

}



}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Вы должны установить рамки слоя в viewDidLayoutSubviews, а не в viewDidLoad.Обратите внимание, что размеры представлений изменяются , но добавленные вами слои остаются статичными, поскольку они не обновляются автоматически вместе с их представлениями контейнера:

override func viewDidLayoutSubviews() {
   super.viewDidLayoutSubviews()

   self.previewLayer.frame = self.camViewOutlet.bounds
   self.previewFrame = previewLayer.frame
}

Также обратите внимание на разницу между frame и bounds.camViewOutlet.frame относительно его суперпредставления (self.view), но previewLayer находится внутри camViewOutlet, поэтому вы должны использовать camViewOutlet.bounds.В основном, потому что camViewOutlet ставит X точек ниже верхней части экрана (высота безопасной области), previewLayer также ставит X точек ниже верхней части camViewOutlet.

Есть и другиенебольшие проблемы в вашем коде.

Обратите внимание, что viewWillAppear должен вызывать super.viewWillAppear, и его можно вызывать несколько раз, поэтому вы никогда не должны добавлять представления и слои внутри него.

Вероятно, вам также не следует начинать захват до вызова viewDidAppear.

0 голосов
/ 28 ноября 2018

Это потому, что вы установили Align Top на Safe Area.Просто помните, что у этого телефона есть выемка, поэтому безопасная зона будет ниже.

Если вы измените телефон в вашем Storyboard на iPhone Xs (как упоминалось в вопросе), вы увидите, чтоу вас есть этот пробел.Все, что вам нужно сделать, это установить верхнее ограничение на Superview, а не Safe Area.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...