iOS – 在相机上定位自定义覆盖(垂直alignment)。 顶部黑色栏的大小

我正在寻找一个程序化的解决scheme,以解决以下问题:我想在相机(iOS)上绘制自定义覆盖。 我希望它在摄像机输出视图中垂直居中。 我已经完成了相对于屏幕绘制我的自定义视图,但不是相机图片。

要做到这一点,我需要获得顶部黑色栏大小 。 我怎么才能得到它?

顶部和底部的酒吧大小不相等,这就是为什么我得到的图片有这个恼人的y偏移到底部。

拍摄之前

注意结果图片的偏移量: 拍完照后

好吧,我结束了使用AVFoundation,它最终是更好的解决scheme,因为它是可定制的。 我有self.fullScreenImageViewself.previewLayer作为类属性。 你需要编写你自己的代码来实现button和摄影镜头的代码。 在这里,您可以玩照片的质量,以获得最佳的尺寸/质量。 我用0.6,但是你可以select任何你想要的。

 @import MobileCoreServices; @import AVFoundation; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self.view setBackgroundColor:[UIColor blackColor]]; self.fullScreenImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)]; self.fullScreenImageView.contentMode = UIViewContentModeScaleAspectFit; [self.fullScreenImageView setCenter:self.view.center]; AVCaptureSession *captureSession = [[AVCaptureSession alloc] init]; captureSession.sessionPreset = AVCaptureSessionPresetHigh; AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if (captureDevice) { NSError *error; AVCaptureDeviceInput *captureDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:captureDevice error:&error]; if (!error && [captureSession canAddInput:captureDeviceInput]) { [captureSession addInput:captureDeviceInput]; } } AVCaptureStillImageOutput *stillImageOutput = [AVCaptureStillImageOutput new]; [stillImageOutput setOutputSettings:@{AVVideoCodecKey : AVVideoCodecJPEG, AVVideoQualityKey : @(0.6)}]; [captureSession addOutput:stillImageOutput]; self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:captureSession]; [self.previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; self.previewLayer.frame = self.fullScreenImageView.bounds; self.previewLayer.position = CGPointMake(CGRectGetMidX(self.fullScreenImageView.bounds), CGRectGetMidY(self.fullScreenImageView.bounds)); [self.fullScreenImageView.layer addSublayer:self.previewLayer]; [captureSession startRunning]; CGRect circleRect = CGRectMake(0, (self.fullScreenImageView.bounds.size.height - self.fullScreenImageView.bounds.size.width) / 2, self.fullScreenImageView.bounds.size.width, self.fullScreenImageView.bounds.size.width); UIBezierPath *circle = [UIBezierPath bezierPathWithOvalInRect:circleRect]; CAShapeLayer *ringLayer = [CAShapeLayer layer]; ringLayer.path = circle.CGPath; ringLayer.fillColor = nil; ringLayer.strokeColor = [UIColor redColor].CGColor; ringLayer.lineWidth = 2.0; ringLayer.lineDashPattern = @[@5.0, @10.0]; [self.fullScreenImageView.layer addSublayer:ringLayer]; [self.navigationController setToolbarHidden:NO]; [self.navigationController.toolbar setBarStyle:UIBarStyleBlackOpaque]; [self.navigationController.toolbar setTintColor:[UIColor whiteColor]]; // Add here some buttons, which are standard UIBarButtonItems [self.view addSubview:self.fullScreenImageView]; }