UIImagePickerController аварийно завершает работу при запуске

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

Завершение работы приложения из-за необработанного исключения «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

#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

person Greg Bew    schedule 05.03.2013    source источник


Ответы (2)


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

person Greg Bew    schedule 10.03.2013

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

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

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

person Adrian P    schedule 05.03.2013
comment
Спасибо за ответ, к сожалению, я все еще получаю сообщение об ошибке, которое пробовал с добавленным кодом, и все это закомментировано, и изменений нет. -(BOOL)shouldAutorotate { return NO; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } - person Greg Bew; 06.03.2013