6

我正在寻找以下问题的编程解决方案:我想在相机(iOS)上绘制自定义叠加层。我希望它位于相机输出视图的垂直中心。我已经完成了将我的自定义视图相对于屏幕居中绘制,而不是相对于相机图片。

为此,我需要获取top black bar 的大小。我怎么才能得到它?

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

拍照前

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

4

1 回答 1

2

好的,伙计们,我最终使用了 AVFoundation,它最终是更好的解决方案,因为它是可定制的。我有self.fullScreenImageViewself.previewLayer作为类属性。您需要编写自己的代码来实现按钮和拍照的代码。在这里,您可以调整照片的质量以获得最佳尺寸/质量。我用的是 0.6,但你可以选择任何你想要的。

@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];
}
于 2015-07-17T14:47:55.233 回答