| 
									
										
										
										
											2023-02-21 15:00:48 +01:00
										 |  |  | // | 
					
						
							|  |  |  | //  PreviewView.swift | 
					
						
							|  |  |  | //  VisionCamera | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2023-09-01 13:08:33 +02:00
										 |  |  | //  Created by Marc Rousavy on 30.11.22. | 
					
						
							|  |  |  | //  Copyright © 2022 mrousavy. All rights reserved. | 
					
						
							| 
									
										
										
										
											2023-02-21 15:00:48 +01:00
										 |  |  | // | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-01 13:08:33 +02:00
										 |  |  | import AVFoundation | 
					
						
							| 
									
										
										
										
											2023-02-21 15:00:48 +01:00
										 |  |  | import Foundation | 
					
						
							|  |  |  | import UIKit | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-01 13:08:33 +02:00
										 |  |  | class PreviewView: UIView { | 
					
						
							| 
									
										
										
										
											2023-09-23 10:14:27 +02:00
										 |  |  |   /**
 | 
					
						
							|  |  |  |    Convenience wrapper to get layer as its statically known type. | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2023-09-01 13:08:33 +02:00
										 |  |  |   var videoPreviewLayer: AVCaptureVideoPreviewLayer { | 
					
						
							|  |  |  |     // swiftlint:disable force_cast | 
					
						
							|  |  |  |     return layer as! AVCaptureVideoPreviewLayer | 
					
						
							|  |  |  |     // swiftlint:enable force_cast | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-23 10:14:27 +02:00
										 |  |  |   /**
 | 
					
						
							|  |  |  |    Gets or sets the resize mode of the PreviewView. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   var resizeMode: ResizeMode = .cover { | 
					
						
							|  |  |  |     didSet { | 
					
						
							|  |  |  |       switch resizeMode { | 
					
						
							|  |  |  |       case .cover: | 
					
						
							|  |  |  |         videoPreviewLayer.videoGravity = .resizeAspectFill | 
					
						
							|  |  |  |       case .contain: | 
					
						
							|  |  |  |         videoPreviewLayer.videoGravity = .resizeAspect | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-01 13:08:33 +02:00
										 |  |  |   override public class var layerClass: AnyClass { | 
					
						
							|  |  |  |     return AVCaptureVideoPreviewLayer.self | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-04 12:53:52 +02:00
										 |  |  |   func layerRectConverted(fromMetadataOutputRect rect: CGRect) -> CGRect { | 
					
						
							|  |  |  |     return videoPreviewLayer.layerRectConverted(fromMetadataOutputRect: rect) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-06 14:30:12 +02:00
										 |  |  |   func captureDevicePointConverted(fromLayerPoint point: CGPoint) -> CGPoint { | 
					
						
							|  |  |  |     return videoPreviewLayer.captureDevicePointConverted(fromLayerPoint: point) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-01 13:08:33 +02:00
										 |  |  |   init(frame: CGRect, session: AVCaptureSession) { | 
					
						
							|  |  |  |     super.init(frame: frame) | 
					
						
							|  |  |  |     videoPreviewLayer.session = session | 
					
						
							|  |  |  |     videoPreviewLayer.videoGravity = .resizeAspectFill | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @available(*, unavailable) | 
					
						
							|  |  |  |   required init?(coder _: NSCoder) { | 
					
						
							|  |  |  |     fatalError("init(coder:) is not implemented!") | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |