UIImagePickerController non riempie lo schermo

screenshot http://sofit.miximages.com/iphone/oiermb.png

Sto aggiungendo una sovrapposizione personalizzata a UIImagePickerController e c’è una barra nera persistente nella parte inferiore della vista. Ecco il mio codice per creare un’istanza del controller.

- (UIImagePickerController *)imagePicker { if (_imagePicker) { return _imagePicker; } _imagePicker = [[UIImagePickerController alloc] init]; _imagePicker.delegate = self; if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { _imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; _imagePicker.showsCameraControls = NO; _imagePicker.wantsFullScreenLayout = YES; _imagePicker.navigationBarHidden = YES; _imagePicker.toolbarHidden = YES; } else { _imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; } return _imagePicker; } 

Il controller restituito viene visualizzato in modo modale e funziona perfettamente (ovvero visualizza lo schermo intero) quando non nascondo i controlli della fotocamera.


Grazie al suggerimento di Ole ho capito che funziona con questo codice:

 // Resize the camera preview _imagePicker.cameraViewTransform = CGAffineTransformMakeScale(1.0, 1.03); 

Un aumento di altezza del 3% ha funzionato bene. Quando aggiungo la mia barra degli strumenti personalizzata nella parte inferiore dello schermo non c’è più una barra nera visibile attraverso la finestra.

Le proporzioni della fotocamera sono 4: 3 e lo aspect ratio dello schermo è 3: 2. Quindi non c’è semplicemente modo per l’immagine della telecamera di riempire lo schermo a meno che tu non voglia ritagliare 3: 2. Per fare ciò, applicare una trasformazione di scala appropriata.

Scalare di un valore fisso non è una buona idea … poiché sono sicuro che chiunque abbia usato la risposta accettata qui probabilmente ha scoperto quando è uscito l’iPhone 5.

Ecco uno snippet di codice da scalare in modo dinamico in base alla risoluzione dello schermo per eliminare il pugilato delle lettere.

 // Device's screen size (ignoring rotation intentionally): CGSize screenSize = [[UIScreen mainScreen] bounds].size; // iOS is going to calculate a size which constrains the 4:3 aspect ratio // to the screen size. We're basically mimicking that here to determine // what size the system will likely display the image at on screen. // NOTE: screenSize.width may seem odd in this calculation - but, remember, // the devices only take 4:3 images when they are oriented *sideways*. float cameraAspectRatio = 4.0 / 3.0; float imageWidth = floorf(screenSize.width * cameraAspectRatio); float scale = ceilf((screenSize.height / imageWidth) * 10.0) / 10.0; self.ipc.cameraViewTransform = CGAffineTransformMakeScale(scale, scale); 

Ehi, ho visto che alcune persone stavano ancora ottenendo la barra nera nella parte inferiore dopo aver calcolato la scala per l’iPhone 5. Ho avuto questo problema per un po ‘ma poi ho capito che devi tradurre la vista in modo che sia nel mezzo dello schermo e quindi applicare la scala. Ecco il mio codice per fare queste due cose e funziona per me!

  CGSize screenBounds = [UIScreen mainScreen].bounds.size; CGFloat cameraAspectRatio = 4.0f/3.0f; CGFloat camViewHeight = screenBounds.width * cameraAspectRatio; CGFloat scale = screenBounds.height / camViewHeight; m_imagePickerController.cameraViewTransform = CGAffineTransformMakeTranslation(0, (screenBounds.height - camViewHeight) / 2.0); m_imagePickerController.cameraViewTransform = CGAffineTransformScale(m_imagePickerController.cameraViewTransform, scale, scale); 

Trasformalo con questo:

 #define CAMERA_TRANSFORM 1.12412 _picker.wantsFullScreenLayout = YES; _picker.cameraViewTransform = CGAffineTransformScale(_picker.cameraViewTransform, CAMERA_TRANSFORM, CAMERA_TRANSFORM); 

Dalla mia esperienza su iOS 7, iphone 5S, per vedere il centro dell’immagine nell’anteprima a schermo intero devi concatenare le trasformazioni, non renderle in sequenza:

 pickerController.cameraOverlayView = self.view; CGSize screenSize = [[UIScreen mainScreen] bounds].size; // 320 x 568 float scale = screenSize.height / screenSize.width*3/4; // screen height divided by the pickerController height ... or: 568 / ( 320*4/3 ) CGAffineTransform translate=CGAffineTransformMakeTranslation(0,(screenSize.height - screenSize.width*4/3)*0.5); CGAffineTransform fullScreen=CGAffineTransformMakeScale(scale, scale); pickerController.cameraViewTransform =CGAffineTransformConcat(fullScreen, translate); 

E qui la risposta in Swift.

 let screenSize:CGSize = UIScreen.mainScreen().bounds.size let ratio:CGFloat = 4.0 / 3.0 let cameraHeight:CGFloat = screenSize.width * ratio let scale:CGFloat = screenSize.height / cameraHeight let imag:UIImagePickerController = UIImagePickerController() imag.cameraViewTransform = CGAffineTransformMakeTranslation(0, (screenSize.height - cameraHeight) / 2.0) imag.cameraViewTransform = CGAffineTransformScale(imag.cameraViewTransform, scale, scale) 

Ho usato questo metodo per calcolare la scala.

 // get the screen size CGSize screenSize = [[UIScreen mainScreen] bounds].size; // establish the height to width ratio of the camera float heightRatio = 4.0f / 3.0f; // calculate the height of the camera based on the screen width float cameraHeight = screenSize.width * heightRatio; // calculate the ratio that the camera height needs to be scaled by float scale = screenSize.height / cameraHeight; imagePicker.cameraViewTransform = CGAffineTransformMakeScale(scale, scale); 

Questo ha funzionato per me su iOS 10:

 let screenSize = UIScreen.main.bounds.size let cameraAspectRatio = CGFloat(4.0 / 3.0) let cameraImageHeight = screenSize.width * cameraAspectRatio let scale = screenSize.height / cameraImageHeight imagePickerController.cameraViewTransform = CGAffineTransform(translationX: 0, y: (screenSize.height - cameraImageHeight)/2) imagePickerController.cameraViewTransform = imagePickerController.cameraViewTransform.scaledBy(x: scale, y: scale) 

il mio problema risolto 🙂

 //Camera is 426 * 320. Screen height is 568. Multiply by 1.333 in 5 inch (iPhone5) to fill vertical CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 71.0); //This slots the preview exactly in the middle of the screen by moving it down 71 points self.imagePickerController.cameraViewTransform = translate; CGAffineTransform scale = CGAffineTransformScale(translate, 1.333333, 1.333333); self.imagePickerController.cameraViewTransform = scale; 

Prova a usare questo codice:

 picker.wantsFullScreenLayout = YES; CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 71.0); CGAffineTransform scale = CGAffineTransformScale(translate, 1.333333, 1.47); picker.view.transform = scale; 
 PickerViewController.m #define CAMERA_TRANSFORM 1.8 - (void)viewDidAppear:(BOOL)animated { if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { // type = UIImagePickerControllerSourceTypeCamera; UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.allowsEditing = NO; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypeCamera; picker.showsCameraControls=NO; picker.extendedLayoutIncludesOpaqueBars = YES; picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform, CAMERA_TRANSFORM , CAMERA_TRANSFORM); [self presentViewController:picker animated:YES completion:nil]; }else{ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message" message:@"Device have no camera" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } }