2009-10-15 5 views

Répondre

-1

Vous devez déjà savoir quand l'appareil photo est prêt à prendre une photo. Au moins la façon dont j'utilise une superposition de caméra personnalisée, je initie la vue avec quelque chose comme self.sourceType = UIImagePickerControllerSourceTypeCamera; et l'autre configuration habituelle, et la caméra est prête (ou "iris is open") à ce stade. En résumé, si on utilise une superposition de caméra personnalisée comme je suis habitué à l'utiliser, on saura quand l'iris est ouvert car il est sous votre contrôle.

+0

Ceci ne répond pas à sa question. Son problème est que sa superposition est visible pendant l'animation de l'iris et il veut montrer quelque chose de différent sur la superposition seulement une fois l'animation terminée. Vous n'avez aucun contrôle sur le temps que prendra l'iPhone pour présenter le contrôleur de la caméra et ouvrir l'iris; Vous ne savez que lorsque vous avez demandé au contrôleur de vue de démarrer ce processus. – ddoughty

+0

J'ai répondu le mieux possible. :-) Ma superposition fait exactement cela: n'apparaît qu'une fois l'animation terminée. En fait, en regardant la version de débogage sur mon téléphone en ce moment, il y a un moment bref (presque indétectable si je ne l'avais pas cherché) quand l'ancienne superposition est montrée après l'animation et avant que l'overlay modifié soit affiché. La superposition n'est jamais affichée au-dessus de l'animation. Si l'OP veut suivre et confirmer que c'est le comportement souhaité, je peux extraire le code et afficher la séquence que j'utilise. – mikestew

+0

Indépendamment du questionneur, je suis intéressé par votre code. :-) Vous semblez sous-entendre que vous avez deux superpositions, mais où/quand changez-vous de l'un à l'autre? Mon autre question concerne votre ligne self.sourceType, ce qui implique que vous sous-classez le sélecteur, mais peut-être que c'était juste un raccourci dans votre réponse? Le code que je l'ai vu et utilisé suit ce thème: a) créer une vue personnalisée b) créer le sélecteur c) ajouter le point de vue que la superposition du sélecteur d) régler la sourceType du sélecteur e) présente le sélecteur Lorsque vous faites cela, vous voyez l'iris ouvert sur votre vue personnalisée. – ddoughty

3

Vous pouvez écouter la notification PLCameraViewIrisAnimationDidEndNotification. Comme ce n'est pas officiellement documenté, vous pourriez être en violation des TOS d'Apple, mais je pense que tant que vous écrivez votre code de sorte qu'il est défensif contre la possibilité que le nom ou le contrat de cette notification pourrait changer (donc à l'avenir vous pourrait ne pas obtenir l'événement) vous serez probablement ok. En d'autres termes, utilisez une minuterie ou une autre technique pour vous assurer que la chose que vous voulez faire quand l'iris est ouvert finira par se produire même si vous n'obtenez jamais la notification ...

Exemple trivial sans programmation défensive. (Bien sûr, vous pouvez enregistrer un intérêt que pour cette notification spécifique ainsi, voir la documentation pour le centre de notification.)

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(notificationCallback:) 
              name:nil 
              object:nil 
]; 

- (void) notificationCallback:(NSNotification *) notification { 
    if ([[notification name] isEqualToString:@"PLCameraViewIrisAnimationDidEndNotification"]) { 
     NSLog(@"Iris open"); 
     // we don't need to listen any more 
     [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    } 
} 
+0

J'ai vu assez de choses cesser de travailler dans les API de caméra non documentées entre 2.x et 3.x, je ne suis pas sûr que je comptais sur un appel non documenté. – mikestew

0

La façon dont je résolu ce problème est que j'initialiser tous les éléments avec l'ensemble de propriétés cachées à OUI, puis appelez un sélecteur retardé de 3 secondes après avoir appelé la caméra, où j'ai mis tous les éléments à caché = NON. Ce n'est pas une solution idéale, mais cela semble fonctionner, et tout retard après l'ouverture de l'iris est négligeable.

3

Il semble que PLCameraViewIrisAnimationDidEndNotification ne soit plus notifié dans iOS5.

Je n'arrive pas à comprendre quelle est la solution appropriée quand l'iris a fini de s'ouvrir, il faut une autre option plutôt que d'utiliser une minuterie de 3 secondes.

Vérifiez ici: https://devforums.apple.com/message/561008#561008

2

J'ai un ViewController (ALImagePickerController) qui détient, initialise et présente le UIImagePickerController en tant que contrôleur de vue de l'enfant (j'ai un autre contrôleur de vue de l'enfant pour la présentation de l'image prise non représentée ici) et je présente (en modal) le ALImagePickerController quand je veux utiliser la caméra. Donc, pendant ce temps, le viewDidAppear du ViewContoller, j'ajoute une animation pour ajouter la superposition de la caméra avec élégance lorsque l'animation de l'obturateur disparaît.

@interface ALImagePickerController() 

@property (nonatomic) UIImagePickerController   *cameraController; 
@property (nonatomic) CameraOverlayView     *overlayView; 
.... 

@end 

@implementation ALImagePickerController 

.... 


- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [UIApplication sharedApplication].statusBarHidden = YES; 

    self.cameraController = [UIImagePickerController new]; 
    self.cameraController.sourceType = UIImagePickerControllerSourceTypeCamera; 
    self.cameraController.delegate = self; 
    self.cameraController.allowsEditing = NO; 
    self.cameraController.showsCameraControls = NO; 
    .... 

    self.overlayView = [CameraOverlayView new]; 
    .... 
    self.overlayView.alpha = 0; 
    self.cameraController.cameraOverlayView = self.overlayView; 

    .... 

    // add as child view controller 
    [self addChildViewController:self.cameraController]; 
    [self.view addSubview:self.cameraController.view]; 
    [self.cameraController didMoveToParentViewController:self]; 
} 


- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [UIApplication sharedApplication].statusBarHidden = NO; 
} 


- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    // smoothly bring in the overlay as the native camera shutter animation opens. 
    [UIView animateWithDuration:0.2 delay:0.3 options:UIViewAnimationCurveEaseOut animations:^{ 
     self.overlayView.alpha = 1.f; 
    } completion:nil]; 
} 

.... 

@end 
Questions connexes