1

J'ai un UIViewController, que je voudrais charger en chargeant la vue - pour ouvrir un UIImagePickerController pour la caméra.Ouvrir UIImagePickerController lorsque la vue est chargée

R. J'écrit ce qui suit: ÉDITÉE - J'utilise maintenant viewDidAppear

- (void)viewDidAppear:(BOOL)animated{ 
    imagePicker = [[UIImagePickerController alloc] init]; 
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){ 
     [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera]; 
    } 
    else{ 
     [imagePicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; 
    } 
    [imagePicker setDelegate:self]; 
    [self presentModalViewController:imagePicker animated:YES]; 
} 

le problème est que lorsque l'utilisateur prend un coup de pression ou de sélectionner une image à partir du dossier - il continue à charger la UIImagePicker à nouveau - comment puis-je l'appeler une seule fois?

B. Je souhaite que l'appareil photo soit affiché à l'intérieur d'un rectangle (peut être UIImage ou UIView) et non en plein écran afin que je puisse quitter ma barre de navigation supérieure.

Comment puis-je obtenir ce qui précède?

+0

Vous ne pouvez pas faire cela avec un sélecteur d'image, vous devrez créer une session de capture avec l'appareil photo comme périphérique d'entrée et l'afficher dans une vue personnalisée. : //www.musicalgeometry.com/? p = 1273 –

+0

Ce que je ne peux pas faire A ou B? – Dejell

+0

Type de deux. Pour "A" je vous recommande de le faire dans viewDidAppear à un void wait_fence errors, et "B" ne peut pas être fait en utilisant un sélecteur d'image. –

Répondre

1

Pour le cas A, mieux mettre cela en viewDidAppear au lieu de viewWillAppear pour éviter les collisions d'animation (et wait_fences erreur)

pour le cas B, soit vous avez besoin d'une session de capture, ou besoin d'Tweek le UIImagePickerController en utilisant une transformation. Vous pouvez le faire grâce au suivi UIImagePickerController propriétés:

  • cameraViewTransform pour changer le CGAffineTransform appliqué à la vue qui affiche la caméra/vidéo. Ainsi, vous serez en mesure de le réduire par exemple
  • showsCameraControls que vous pouvez définir à NO pour cacher la valeur par défaut contrôle iOS si vous prévoyez d'ajouter votre propre UIButtons au lieu
  • cameraOverlayView qui vous permet de mettre un UIView arbitraire au-dessus de la vue de la caméra. Vous utilisez généralement une vue qui a un backgroundColor = [UIColor clearColor] et d'ajouter quelques subviews à lui, en particulier certains UIImageView décoratif si nécessaire (un cadre par exemple), certains UIButton s pour déclencher l'appareil photo (et d'utiliser les méthodes de takePicture, startVideoCapture et stopVideoCaptureUIImagePickerController dans leur correspondant IBAction au besoin) et remplacer les commandes de la caméra-it de construire vous Hid avec la propriété précédente, et ainsi de suite

Dans votre cas, si vous voulez garder le bouton de l'appareil photo classique mais veulent juste changer le cadre et Ne le faites pas en plein écran, la propriété cameraTransform est généralement ce dont vous avez besoin. Ajout d'un cadre décoratif autour va simplement consister à utiliser un UIImageView pour la propriété cameraOverlayView et l'utiliser pour afficher l'image du cadre décoratif (image avec son centre transparent de sorte que la vue de la caméra est visible à travers elle, bien sûr)


[EDIT] Notez que (selon la documentation) la propriété cameraTransform n'est disponible que lors de la capture de films (lorsque sourceType == UIImagePickerControllerSourceTypeCamera). Donc, vous pouvez l'utiliser pour laisser l'utilisateur prendre une photo de son appareil photo, mais si vous voulez utiliser votre UIImagePickerController pour choisir une image de la bibliothèque, vous ne pouvez pas utiliser le cameraTransform (et cela est assez logique, car cela semblerait étrange pour afficher à l'écran). Veillez donc à ne l'utiliser que dans ce cas, et surtout à l'éviter lorsque le type de source UIImagePickerControllerSourceTypeCamera n'est pas disponible sur l'appareil.

+0

viewWillApepar continue de le charger non stop - après que l'utilisateur ait capturé l'image ou en ait choisi un dans la bibliothèque, il la charge à nouveau – Dejell

+0

, vous devez utiliser une condition. En règle générale, une fois que l'utilisateur a capturé l'image, vous la gardez probablement dans un @property UIImage * chosenImage; 'de votre' UIViewController', vous pouvez donc utiliser 'if (self.chosenImage == nil)' comme condition pour montrer le 'UIImagePickerController' dans' viewDidAppear';) – AliSoftware

+0

Merci. en ce qui concerne cameraOverlayView - avez-vous un exemple de code comment le faire? – Dejell

0
- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self getMediaFromSource:UIImagePickerControllerSourceTypeCamera]; 

} 
- (IBAction)TakePhoto:(id)sender { 
    [self getMediaFromSource:UIImagePickerControllerSourceTypeCamera]; 
} 

- (void)getMediaFromSource:(UIImagePickerControllerSourceType)sourceType{ 
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    picker.delegate   = self; 
    picker.allowsEditing  = NO; 
    picker.sourceType   = sourceType; 
    [self presentModalViewController:picker animated:YES]; 

    [picker release]; 
} 

#pragma mark - UIImagePickerController delegate methods 
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 
    [picker dismissModalViewControllerAnimated:YES]; 
    [self.tabBarController setSelectedIndex:1]; 
} 
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 

    [picker dismissModalViewControllerAnimated:YES]; 
    [self.tabBarController setSelectedIndex:1]; 
} 

Mise à jour de la partie B. code Exemple de cameraOverlayView

- (void)setupImagePicker:(UIImagePickerControllerSourceType)sourceType 
{ 
    self.imagePickerController.sourceType = sourceType; 

if (sourceType == UIImagePickerControllerSourceTypeCamera) 
{ 
    // user wants to use the camera interface 
    // 
    self.imagePickerController.showsCameraControls = NO; 

    if ([[self.imagePickerController.cameraOverlayView subviews] count] == 0) 
    { 
     // setup our custom overlay view for the camera 
     // 
     // ensure that our custom view's frame fits within the parent frame 
     CGRect overlayViewFrame = self.imagePickerController.cameraOverlayView.frame; 
     CGRect newFrame = CGRectMake(0.0, 
            CGRectGetHeight(overlayViewFrame) - 
            self.view.frame.size.height - 10.0, 
            CGRectGetWidth(overlayViewFrame), 
            self.view.frame.size.height + 10.0); 
     self.view.frame = newFrame; 
     [self.imagePickerController.cameraOverlayView addSubview:self.view]; 
    } 
} 
} 

http://developer.apple.com/library/ios/#samplecode/PhotoPicker/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010196

Je suggère de jouer avec le « cameraOverlayView, » pour essayer de créer une sorte de barre de navigation pseudo dans lequel l'interaction fonctionne comme vous le souhaitez. "Vous pouvez personnaliser un contrôleur de sélecteur d'image pour gérer vous-même les interactions de l'utilisateur.Pour ce faire, fournissez une vue de superposition contenant les contrôles que vous souhaitez afficher et utilisez les méthodes décrites dans" Capture d'images fixes ou de films ". Les vues de superposition personnalisées pour la classe UIImagePickerController sont disponibles dans iOS 3.1 et versions ultérieures via la propriété cameraOverlayView Pour un exemple de code, voir l'exemple de projet PhotoPicker.

Important La classe UIImagePickerController ne prend en charge que le mode portrait Cette classe est destinée à être utilisée telle quelle et ne prend pas en charge la sous-classe La hiérarchie de vue de cette classe est privée et ne doit pas être modifiée. exception. Vous pouvez attribuer une vue personnalisée à la propriété cameraOverlayView et utiliser ce point de vue de présenter des informations supplémentaires ou gérer les interactions entre l'interface de la caméra et votre code. »

http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIImagePickerController_Class/UIImagePickerController/UIImagePickerController.html

+0

Votre solution est pour A. Mais qu'en est-il de B? – Dejell

+0

Donc, je ne suis pas sûr que le pickercontrol puisse faire ce que vous demandez B. Voir la mise à jour ci-dessus. –

1

Il suffit de mettre en œuvre votre action dans la méthode viewDidLoad. Cette C'est ce que j'ai fait et ça marche parfaitement bien maintenant

Questions connexes