2015-05-19 4 views
4

Я ищу программное решение для следующей проблемы: я хочу нарисовать пользовательский оверлей на камеру (iOS). И я хочу, чтобы она была вертикально центральной на выходе камеры. Я сделал, чтобы нарисовать свой пользовательский вид по отношению к экрану, но не к камере.iOS - позиционирование пользовательского наложения на камеру (вертикальное выравнивание). Размер верхней черной полосы

Для этого мне нужно получить размер верхней черной полосы . Как я могу его получить?

Размер верхних и нижних баров не равен, поэтому картина, которую я получаю, имеет это раздражающее смещение y к основанию.

Before shooting a pic

Обратите внимание на смещение результирующей картинке: After shooting a pic

+0

Настройка AVCaptureSession и прикрепить AVCaptureVideoPreviewLayer, то вы будете иметь полный контроль над размером и размещением камеры. – Sten

+0

Дело в том, что у меня будет только просмотр камеры, и это нормально, но я также хочу иметь все функции, которые предлагает 'UIImagePickerController'. Я хотел бы просто узнать **, где ** этот контроллер просмотра размещает свой вид камеры –

+0

AVCaptureSession имеет все, что предлагает UIImagePickerController, и многое другое. UIImagePickerController предназначен как простой способ добавить стандартную камеру, а не для детального контроля. Макет, вероятно, будет выглядеть по-разному на разных аппаратных средствах. – Sten

ответ

1

OK ребята, я в конечном итоге с помощью AVFoundation, который в конце концов был даже лучшим решением, поскольку это настраивается. У меня были self.fullScreenImageView и self.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]; 
}