2013-03-05 4 views
1

Представляю пользователю viewController с представлением, которое показывает UIButton для записи видео. Когда пользователь нажимает кнопку, мое приложение выходит из строя со следующей ошибкой:Сбой UIImagePickerController при запуске

Завершение приложения из-за неперехваченного исключения 'UIApplicationInvalidInterfaceOrientation', причина: 'preferredInterfaceOrientationForPresentation должен возвращать поддерживаемую ориентацию интерфейса!'

Мое приложение поддерживает только портретную ориентацию, и файл info.plist правильно отображен. Я использую тот же код в другом приложении, найденном на сайте Рэя Вендерлиха, и он отлично работает. Код для файлов .h и .m приведен ниже. Любая помощь будет оценена по достоинству.

.h

#import <MediaPlayer/MediaPlayer.h> 
#import <MobileCoreServices/UTCoreTypes.h> 
#import <AssetsLibrary/AssetsLibrary.h> 

@interface RecordSwingViewController: UIViewController 

-(BOOL)startCameraControllerFromViewController:(UIViewController*)controller 
           usingDelegate:(id)delegate; 
-(void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void*)contextInfo; 



@property (weak, nonatomic) IBOutlet UIButton *record; 
- (IBAction)recordSwing:(id)sender; 

@end 

.m

#import "RecordSwingViewController.h" 

@interface RecordSwingViewController() 

@end 

@implementation RecordSwingViewController 



- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)recordSwing:(id)sender { 
    [self startCameraControllerFromViewController:self usingDelegate:self]; 

} 
-(BOOL)shouldAutorotate 
{ 
    return NO; 
} 



-(BOOL)startCameraControllerFromViewController:(UIViewController*)controller 
           usingDelegate:(id)delegate { 
    // 1 - Validattions 
    if (([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO) 
     || (delegate == nil) 
     || (controller == nil)) { 
     return NO; 
    } 
    // 2 - Get image picker 
    UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init]; 
    cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; 
    // Displays a control that allows the user to choose movie capture 
    cameraUI.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie, nil]; 
    // Hides the controls for moving & scaling pictures, or for 
    // trimming movies. To instead show the controls, use YES. 
    cameraUI.allowsEditing = NO; 
    cameraUI.delegate = delegate; 
    // 3 - Display image picker 
    [controller presentViewController: cameraUI animated: YES completion:nil]; 
    return YES; 
} 
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType]; 
    [self dismissViewControllerAnimated:NO completion:nil]; 
    // Handle a movie capture 
    if (CFStringCompare ((__bridge_retained CFStringRef) mediaType, kUTTypeMovie, 0) == kCFCompareEqualTo) { 
     NSString *moviePath = [[info objectForKey:UIImagePickerControllerMediaURL] path]; 
     if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(moviePath)) { 
      UISaveVideoAtPathToSavedPhotosAlbum(moviePath, self, 
               @selector(video:didFinishSavingWithError:contextInfo:), nil); 
     } 
    } 
} 

-(void)video:(NSString*)videoPath didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo { 
    if (error) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Video Saving Failed" 
                 delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 
    } else { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Video Saved" message:@"Saved To Photo Album" 
                 delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 
    } 
} 
@end 

ответ

0

Вы реализовали логическое значение для авторотации, но не уточнил, если он автоматически не вращается, что еще он должен делать. Попробуйте следующее после метода авторотации.

-(NSUInteger)supportedInterfaceOrientations 
{ 
return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
} 

Удалите любую из масок, которые вам не нужны, из приведенного выше метода и посмотрите, работает ли это для вас.

+0

Спасибо за ответ, к сожалению, я все еще получаю ошибку, которую я пробовал с добавленным кодом, и все это прокомментировало и никаких изменений. - (BOOL) shouldAutorotate { return NO; } - (NSUInteger) supportedInterfaceOrientations { возвращение UIInterfaceOrientationMaskPortrait; } –

1

Хорошо, вот ответ, наконец.
https://stackoverflow.com/a/12570501/2133494 В принципе мне нужно было добавить категорию в мой UIImagePickerController. Я пробовал много других исправлений, но это сработало.

Смежные вопросы