Comment obtenir les overlays pour UIImagePicker de l'appareil photo en plein écran sous iOS 7?
Je suis intéressé en utilisant une mesure de recouvrement pour la UIImagePickerController
pour les contrôles de caméra qui prennent tout l'écran, très semblable à ce que la valeur par défaut de la Caméra app n'lors du passage à la fonction vidéo.
J'ai référencé plusieurs questions sur soi, sur ce sujet, en particulier, à cette un, ainsi que la Apple exemple sur la façon d'utiliser un overlay pour le UIImagePickerController, mais aucun d'eux n'a été en mesure de produire un bon, plein-écran de résultat avec iOS 7.
Jusqu'à présent, c'est ce que l'appareil photo de l'INTERFACE utilisateur ressemble avec les overlays (sans boutons):
Remarque qu'il y a une barre noire en bas de l'écran. J'ai remarqué que je pourrait obtenir la barre noire retiré si je change le cameraAspectRatio
à 1, mais ce qui fausse le zoom de la caméra comme il a alors une très zoom en vue. Est-il un moyen pour avoir le plein écran, sans en dénaturer le zoom trop (je comprends qu'un petit peu), et également de supprimer les barres noires?
Voici mon code qui configure les overlays:
{
self.imagePickerController.showsCameraControls = NO;
[[NSBundle mainBundle] loadNibNamed:@"overlayView" owner:self options:nil];
self.overlayView.frame = self.imagePickerController.cameraOverlayView.frame;
self.imagePickerController.cameraOverlayView = self.overlayView;
self.overlayView = nil;
//Device's screen size (ignoring rotation intentionally):
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
float cameraAspectRatio = 4.0 / 3.0; //! Note: 4.0 and 4.0 works
float imageWidth = floorf(screenSize.width * cameraAspectRatio);
float scale = ceilf((screenSize.height / imageWidth) * 10.0) / 10.0;
self.imagePickerController.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);
}
Mise à jour:
Un autre problème que j'ai remarqué est que, l'image qui est affichée dans l'aperçu de l'appareil photo est toujours petits et a moins de détails que l'image qui est enregistré lorsque la méthode [self.imagePickerController takePicture]
. Pour illustrer:
C'est ce que le clavier ressemble dans l'aperçu de la caméra avec la barre noire au-dessous (désolé il est un peu fragile):
Cependant, noter que l'image capturée dans le panneau d'aperçu a beaucoup plus de détails comme le montre ici, en particulier vers le haut, ainsi que les deux de gauche et de droite.
Ma question est, comment serait en mesure de régler mon prévisualisation de la caméra de sorte que ce que l'utilisateur voit dans l'aperçu est exactement l'image qu'il capture et pourrait être démontré par la suite? Merci!
Mise à jour 2
Ici est l'ensemble du code dans viewDidLoad
qui met en place le contrôle de la caméra.
- (void)viewDidLoad
{
[super viewDidLoad];
//Appearance configuration
self.navigationItem.hidesBackButton = YES;
//UIImagePickerController initialization and setup
self.imagePickerController = [[UIImagePickerController alloc] init];
self.imagePickerController.delegate = self;
self.imagePickerController.allowsEditing = NO;
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
self.imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; //if there is a camera avaliable
} else {
self.imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;//otherwise go to the folder
}
self.imagePickerController.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
if (self.imagePickerController.sourceType == UIImagePickerControllerSourceTypeCamera)
{
self.imagePickerController.showsCameraControls = NO;
[[NSBundle mainBundle] loadNibNamed:@"overlayView" owner:self options:nil];
self.overlayView.frame = self.imagePickerController.cameraOverlayView.frame;
self.imagePickerController.cameraOverlayView = self.overlayView;
self.overlayView = nil;
//Device's screen size (ignoring rotation intentionally):
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
int heightOffset = 0;
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
heightOffset = 120; //whole screen :)
}
float cameraAspectRatio = 4.0 / 3.0; //! Note: 4.0 and 4.0 works
float imageWidth = floorf(screenSize.width * cameraAspectRatio);
float scale = ceilf(((screenSize.height + heightOffset) / imageWidth) * 10.0) / 10.0;
self.imagePickerController.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);
}
}
Et dans viewWillAppear
, j'appelle l'image du sélecteur de vue:
BOOL modalPresent = (BOOL)(self.presentedViewController);
//Present the Camera UIImagePicker if no image is taken
if (!appDelegate.imageStorageDictionary[@"picture1"]){
if (modalPresent == NO){ //checks if the UIImagePickerController is modally active
[self presentViewController:self.imagePickerController animated:NO completion:nil];
}
}
OriginalL'auteur daspianist | 2013-12-26
Vous devez vous connecter pour publier un commentaire.
Après de nombreuses tentatives, c'est ce qui a fonctionné pour moi avec beaucoup de grâce à d'autres suggestions. Les faits suivants ont été très utiles à connaître et à garder à l'esprit:
La caméra points résolution est 426 * 320. Pour que l'aperçu de la caméra de la hauteur pour être tendu à l'écran du téléphone de la hauteur de 568, il doit être multiplié par un facteur de 1.3333 lors de l'utilisation de
CGAffineTransformScale
.Remarque que ci-dessous sont codés en dur avec des numéros différents basés sur l'iPhone 5 de la résolution de l'écran dans les points. Ils pourraient être améliorés en utilisant des objets tels que écran.hauteur de l'écran.largeur et d'autres variables afin de la rendre applicable à l'iPhone 4/4s dimensions.
Les côtés gauche et droit sont tronqués. Par exemple, si vous ouvrez le par défaut de l'application appareil photo et l'interrupteur à la vidéo, le rempli d'écran avec des dimensions est exactement ce que vous verriez si vous avez appliqué ce code.
Merci, vous avez sauvé ma journée.... 🙂
génial réponse... 🙂
Merci pour le Post,Vraiment Utile 🙂
OriginalL'auteur daspianist
Assurez-vous de tenir compte de 20px barre d'état changement dans iOS7. Si vous êtes face à un 20px écran noir au bas de l'écran, puis ce sera votre problème. Vous pouvez vérifier si l'application est en cours d'exécution dans ios7 ou non par l'un de ces préprocesseurs
Et vous pouvez faire des modifications suivantes à votre code et voir si cela fonctionne
S'il vous plaît laissez-moi savoir si cela fonctionne. Je n'ai pas touché au code de test.
Autour de 120 est le calcul que je recevais également juste à faire le calcul sur la taille de l'écran. C'est combien il a à être agrandie pour remplir l'écran de haut en bas avec le ratio d'aspect de la caméra capte naturellement... vos options sont soit de recadrer la photo que vous prenez pour correspondre à ce que vous les afficher dans l'aperçu, de fausser l'image de sorte qu'elle s'étend verticalement pour remplir l'écran sur un iPhone5, ou au centre de l'image si vous avez des petites barres en haut et en bas. Personnellement je conseillerais de barres, qui s'en allait sur un iPhone 4 (ou 4s), de toute façon.
À en juger par la première capture d'écran de l'auto.imagePickerController est aligné en haut de l'écran. Je vais essayer d'écrire un code et le tester ici et vous enverra.
Vérifiez également ce post stackoverflow.com/questions/19046070/...
Je n'ai activer la mise en page automatique pour les points de vue. La vue de la caméra est entièrement tendu (ce qui est excellent - merci pour cette suggestion), et maintenant je suis en train de comprendre comment la partie de l'image à découper afin qu'il ressemble exactement l'aperçu de l'image dans la vue de la caméra.
OriginalL'auteur Kamran Khan
Parce que le format de l'écran est différent de celui du 4/3 de la caméra elle-même, vous avez besoin (comme vous l'avez mentionné) à légèrement rogner les bords afin d'avoir l'image d'étendre vers le bas.
Pour ce faire, vous devez avoir de la largeur d'être assez large pour que la hauteur peut être la totalité de l'écran. Donc, à votre image, la largeur et la hauteur doivent être:
Vous aurez aussi probablement obtenir le point de vue de présenter l'image de la caméra pour que la largeur qui s'étend hors des deux côtés de l'écran.
Je pense, oui. Il pourrait être le point de vue actuel est défini à l'aspect ajustement.
Merci pour votre suggestion. Je me suis assuré que les deux la superposition de vue (de la xib) est montré comme à l'échelle pour remplir et a tendu la vue à différentes tailles de tester des choses, y compris de très grandes tailles tels que les 480*680. Cependant, je reçois toujours la barre noire dans la partie inférieure.
OriginalL'auteur Kendall Helmstetter Gelner
Il y a un moyen plus facile méthode pour obtenir votre superposition plein écran au moins testé dans iOS 9.
OriginalL'auteur Nicolas Manzini
Je ne sais pas pourquoi vous utilisez la taille de l'écran. Juste essayer ce code simple:
UIImagePicker
, mais pas avec les overlays.pour ce faire, vous utilisez la superposition ?
Je veux utiliser un overlays de sorte que la caméra de vue sur la totalité de l'écran lorsque vous prenez une photo.
Essayez cameraViewTransform pour le plein écran. CGFloat camScaleup = 2; imagePicker.cameraViewTransform = CGAffineTransformScale(imagePicker.cameraViewTransform, camScaleup, camScaleup);
OriginalL'auteur Naeem Paracha
Essayer ce code pour maintenir votre résultante de l'image dans la taille personnalisée. J'ai obtenu le résultat en utilisant la méthode personnalisée pour arriver résultante image de taille personnalisée.
D'abord créer
IBOutlet
pourUIImageview
.//---- Redimensionner l'image d'origine en utilisant la méthode personnalisée----------------------
OriginalL'auteur svmrajesh
Pour résoudre un problème similaire, j'ai instancié un ViewController de storyboard et utilisé le contrôleur d'affichage en tant que caméra de superposition.
Je ne sais pas si c'est ce que vous cherchez, mais j'ai utilisé le code suivant:
OriginalL'auteur Nico.S
Essayer ce code, il fonctionne très bien pour moi
Ce code suppose que l'aspect de l'original de l'aperçu de l'appareil photo de la zone est de 4:3.
OriginalL'auteur wzienrgo