Vidéo d'logging UIImagePickerController avec orientation paysage

Comment pouvons-nous forcer le controller UIImagePickerController à save de la video uniquement en mode paysage?

Je sais que cette class devrait être utilisée pour l'logging de portrait, mais je dois l'avoir en paysage.

J'ai trouvé plusieurs questions similaires mais il n'y a pas de solution qui fonctionne pour moi (iOS 6.1).

Par exemple, l'observation de l'orientation de l'appareil ne fonctionne pas pour moi (cette réponse- https://stackoverflow.com/a/2147584/775779 )

Si j'implémente la catégorie UIImagePickerController comme suit:

#import "UIImagePickerController+NonRotating.h" @implementation UIImagePickerController (NonRotating) - (BOOL)shouldAutorotate { return YES; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationLandscapeRight; } @end 

cela fonctionne presque, mais je vois un comportement étrange de certaines commands et une mauvaise orientation video pendant l'logging (la video du résultat est correcte).

1) Commencez. Annuler et save le button dans les bonnes positions, mais les autres controls sont erronés. Et la video est tournée. entrez la description de l'image ici

2) Enregistrement. La timer et la video sont erronées. entrez la description de l'image ici

3) L'logging est terminé. tout bon! et la video du résultat est juste.

entrez la description de l'image ici

As tu des idées?

UPDATE J'ai besoin de verrouiller l'écran en orientation Paysage pendant le process d'logging.

Vous devez implémenter un UIImagePickerController personnalisé. Pour cela, vous devez définir la propriété showsCameraControls de l' showsCameraControls sur FALSE.

 self.mImagePickerController.showsCameraControls = NO; self.mImagePickerController.wantsFullScreenLayout = YES; 

Une fois que vous faites cela, aucun contrôle par défaut ne sera visible pour vous. Vous devrez configurer des buttons personnalisés pour démarrer / arrêter l'logging et returnner la camera, etc.

Maintenant, vous pouvez utiliser les methods start / stop pour save une video:

Quand on clique sur démarrer l'logging,

 [self.mImagePickerController startVideoCapture]; 

Arrêter,

 [self.mImagePickerController stopVideoCapture]; 

Pour garder une trace de la commutation entre la camera, vous pouvez utiliser un drapeau

 if (self.mImagePickerController.cameraDevice == UIImagePickerControllerCameraDeviceRear) { self.mImagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront; isFrontCamera = YES; } else { self.mImagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceRear; isFrontCamera = NO; } 

Vous pouvez définir les controls comme vous le souhaitez sur le changement d'orientation. AppDelegate.m

 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

C'est le délégué qui est appelé à changer d'orientation. Vous pouvez utiliser l'object de la class particulière pour appeler sa méthode shouldAutorotate et configurer les positions de contrôle de votre camera en fonction de l'orientation.

 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { [self.objController shouldAutorotate]; return UIInterfaceOrientationMaskAll; } 

Maintenant à l'intérieur de cameraviewcontroller.m

 -(BOOL)shouldAutorotate { UIInterfaceOrientation interfaceOrientation = [[UIDevice currentDevice]orientation]; if(interfaceOrientation == UIInterfaceOrientationPortrait) { // your controls setup } else { // view accordingly for landscape } } 

J'ai essayé de couvrir tous les points. Faites-moi savoir si vous avez une confusion. J'espère que cela aide 🙂

1) Vous devez vérifier la condition sur l'événement de clic du button de camera de bascule.

2) AppDelegate.h: Déclarez un object de votre class où vous enregistrez votre video et créez une propriété. Ici, j'utilise CameraViewController comme exemple.

 CameraViewController *objController; 

Maintenant dans AppDelegate.m:

 self.objController = [[CameraViewController alloc]initWithNibName:@"CameraViewController" bundle:nil]; 

Maintenant, utilisez cette instance pour appeler la méthode shouldAutorotate comme je l'ai montré ci-dessus. Et return orientation paysage:

 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if(isOptionScreenActive == YES) { [self.shareController shouldAutorotate]; return UIInterfaceOrientationMaskLandscape; } else { [self.anotherController shouldAutorotate]; return UIInterfaceOrientationMaskPortrait; } } 

Ici, isOptionScreenActive est un flag défini dans viewWillAppear de la class d'logging. Définissez false dans viewDidUnload . Ou peut-être viewWillAppear d'une autre class.

3) J'ai utilisé cameraviewcontroller.m à titre d'exemple. Cela reflète votre class d'logging. Aussi dans la méthode shouldAutorotate votre class d'logging video, si l'orientation détectée est portrait, renvoyez simplement NO. De cette façon, l'interface user ne changera pas et vous pouvez garder l'interface user en mode paysage uniquement.

essayez ceci pour que cela vous aide

 - (BOOL)shouldAutorotate { return NO; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationLandscapeRight | UIInterfaceOrientationLandscapeLeft; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationLandscapeRight; } - (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft); } 

ça marchera … 🙂