iPhone Xs Max: AVCaptureVideoPreviewLayer при добавлении в подслой View занимает меньше, чем безопасная область iphone x - почему? - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь создать собственную камеру с помощью одного приложения просмотра с новым iPhone Xs Max.Со ссылкой на скриншот ниже, можно увидеть, что вывод видео, отображаемый в AVCaptureVideoPreviewLayer, занимает меньше, чем безопасная область экрана на iPhone x.Как рассчитать пространство, которое не было занято?

Как узнать, что AVCaptureVideoPreviewLayer занимает меньше, чем безопасная область?Ну, верхняя граница верхней «кнопки» привязана к верхней границе безопасной области.Нижняя кнопка аналогично закреплена на нижней части нижней безопасной зоны.Тем не менее, существует огромное перекрытие!

Проблема:

enter image description here

Структура приложения с одним представлением: ограничение верхней части кнопки

enter image description here

Нижнее ограничение нижней белой кнопки: enter image description here

Все остальные ограничения макета:

enter image description here

SWIFT:

class ViewController: UIViewController, UIImagePickerControllerDelegate, AVCaptureVideoDataOutputSampleBufferDelegate  {

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



override func viewDidLoad() {
    super.viewDidLoad()

      let screenSize = UIScreen.main.bounds
      // This is (0.0, 0.0, 414.0, 896.0)

      startAVCaptureSession()

}



override func viewDidLayoutSubviews() {
    print("viewDidLayoutSubviews ...")

    let sAreaFrame = UIApplication.shared.windows[0].safeAreaLayoutGuide.layoutFrame
    self.safeAreaFrame = sAreaFrame

    // self.safeAreaFrame - This is (0.0, 44.0, 414.0, 818.0)


    self.previewLayer.frame = view.bounds // // I have tried  self.previewLayer.frame = self.safeAreaFrame 
    self.previewFrame = previewLayer.frame
}




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
    view.layer.insertSublayer(self.previewLayer, at: 0)



}





}

ССЫЛКА ПРОЕКТА: https://github.com/babylon123/RectangleCapture

...