Я пытаюсь создать собственную камеру с помощью одного приложения просмотра с новым iPhone Xs Max.Со ссылкой на скриншот ниже, можно увидеть, что вывод видео, отображаемый в AVCaptureVideoPreviewLayer, занимает меньше, чем безопасная область экрана на iPhone x.Как рассчитать пространство, которое не было занято?
Как узнать, что AVCaptureVideoPreviewLayer занимает меньше, чем безопасная область?Ну, верхняя граница верхней «кнопки» привязана к верхней границе безопасной области.Нижняя кнопка аналогично закреплена на нижней части нижней безопасной зоны.Тем не менее, существует огромное перекрытие!
Проблема:
Структура приложения с одним представлением: ограничение верхней части кнопки
Нижнее ограничение нижней белой кнопки:
Все остальные ограничения макета:
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