2013-03-13 1 views
13

Come possiamo forzare il controller UIImagePickerController a registrare video solo in modalità orizzontale?UIImagePickerController registra video con orientamento orizzontale

So che questa classe dovrebbe essere utilizzata per la registrazione di ritratti, ma ho bisogno di averla in orizzontale.

Ho trovato diverse domande simili ma non c'è alcuna soluzione che funzioni per me (iOS 6.1).

Per esempio l'osservazione di orientamento del dispositivo non funziona per me (questo risposta- https://stackoverflow.com/a/2147584/775779)

Se implemento categoria UIImagePickerController come la seguente:

#import "UIImagePickerController+NonRotating.h" 

@implementation UIImagePickerController (NonRotating) 

- (BOOL)shouldAutorotate 
{ 

    return YES; 
} 

-(NSUInteger)supportedInterfaceOrientations 

{ 
    return UIInterfaceOrientationMaskLandscape; 

} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationLandscapeRight; 
} 

@end 

quasi funziona, ma vedo un po ' strano comportamento di alcuni controlli e orientamento video errato durante la registrazione (il risultato è ok).

1) Inizio. Annulla e registra il pulsante nelle posizioni corrette, ma altri controlli sono errati. E il video viene ruotato. enter image description here

2) Registrazione. Timer e video sono sbagliati. enter image description here

3) Registrazione terminata. tutto bene! e il risultato è giusto.

enter image description here

avete qualche idea?

UPDATE Ho bisogno di bloccare lo schermo in orientamento orizzontale durante il processo di registrazione.

+3

Si prega di non chiudere questa domanda. la domanda a cui hai fornito un link non ha la risposta giusta e tutte le soluzioni da quei commenti non funzionano. –

+0

@iPatel hai letto la mia domanda? Ho già parlato di questo link. –

+0

hai provato a impostare l'orientamento del video? http://stackoverflow.com/questions/14811641/ios-camera-orientation#14812010 – Gotschi

risposta

0

provare questo può esso w'll aiutare

- (BOOL)shouldAutorotate 
{ 
return NO; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
return UIInterfaceOrientationLandscapeRight | UIInterfaceOrientationLandscapeLeft; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
return UIInterfaceOrientationLandscapeRight; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight ||  interfaceOrientation == UIInterfaceOrientationLandscapeLeft); 
} 

si w'lll lavoro ... :)

+0

grazie per il commento. L'ho provato, ma ho ottenuto un'eccezione: *** Termina l'app a causa di uncastught eccezione 'UIApplicationInvalidInterfaceOrientation', la ragione: 'preferredInterfaceOrientationForPresentation deve restituire un orientamento interfaccia supportata!' –

+0

quale versione di Xcode ru utilizzando ??? – Kalyani

+0

versione 4.6 (4H127) –

3

È necessario implementare una consuetudine UIImagePickerController. Per questo, è necessario impostare la proprietà di imagepicker showsCameraControls su FALSE.

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

Una volta fatto, nessun controllo predefinito sarà visibile all'utente. Avrai bisogno di pulsanti di setup personalizzati per start/stop registrazione e macchina fotografica lanciando ecc

Ora, è possibile utilizzare la start/stop metodi per registrare un video:

Quando si clicca su Start Recording,

[self.mImagePickerController startVideoCapture]; 

Per arrestare,

[self.mImagePickerController stopVideoCapture]; 

per tenere traccia del passaggio tra la fotocamera, è possibile utilizzare una bandiera

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

È possibile impostare i controlli come desiderato sul cambio di orientamento. AppDelegate.m

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

Questo è il delegato che riceve il cambio di orientamento. È possibile utilizzare l'oggetto della particolare classe per chiamare il metodo shouldAutorotate e impostare le posizioni di controllo della telecamera in base all'orientamento.

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

Ora all'interno cameraviewcontroller.m

-(BOOL)shouldAutorotate 
{ 
    UIInterfaceOrientation interfaceOrientation = [[UIDevice currentDevice]orientation]; 

    if(interfaceOrientation == UIInterfaceOrientationPortrait) 
    { 
     // your controls setup 
    } 
    else 
    { 
     // view accordingly for landscape 
    } 
} 

ho cercato di coprire tutti i punti. Fammi sapere se hai qualche confusione. Spero che lo aiuti :)

1) È necessario verificare la condizione all'evento click del pulsante della fotocamera a scatto.

2) AppDelegate.h: dichiara un oggetto della classe in cui si registra il video e si crea una proprietà. Qui sto usando CameraViewController come esempio.

CameraViewController *objController; 

Ora in AppDelegate.m:

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

Ora utilizzare questo esempio per chiamare il metodo shouldAutorotate come ho mostrato sopra. E ritorno orientamento orizzontale:

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

Qui isOptionScreenActive è un flag che è impostato nel viewWillAppear della classe di registrazione. Impostalo false in viewDidUnload. Oppure può essere viewWillAppear di un'altra classe.

3) Ho usato cameraviewcontroller.m solo come esempio. Riflette la tua classe di registrazione. Anche nel metodo shouldAutorotate della classe di registrazione video, se l'orientamento rilevato è verticale, restituire NO. In questo modo l'interfaccia utente non cambierà e potrai mantenere l'interfaccia utente solo in orizzontale.

+0

grazie per il commento. diverse domande prima di provare a implementare questo: 1) "Per tenere traccia del passaggio tra la telecamera, è possibile utilizzare una bandiera" - non è possibile capire dove dovrebbe essere questo codice. 2) "Questo è il delegato che riceve la modifica dell'orientamento, puoi usare l'oggetto della classe particolare per chiamare il metodo shouldAutorotate e impostare le posizioni del controllo della telecamera in base all'orientamento." - "self.objController" - che cos'è?Ho solo una schermata in cui registro video. Dovrebbe essere orizzontale. Altri sono in orientamento verticale. 3) cameraviewcontroller.m - che cos'è questo? –

+0

e vedo che con la tua soluzione supporterà entrambi gli orientamenti. solo con controlli personalizzati. Devo farlo funzionare * solo * in orientamento orizzontale. per bloccarlo. –

+0

Ho aggiornato la risposta per soddisfare le vostre domande. Vedi se aiuta. – Maverick