2014-02-03 2 views
3

Я пытаюсь сделать снимок, используя UIImagePickerControllerSourceTypeCamera. Когда я захватывая фотографию в снимок после, я получаю пустой фото, но если я выбираю Использовать фото Я могу видеть это я мой UIImage:UIImagePickerController camera blank snapshot image

enter image description here также в консольном им получать эти ошибка:

: CGAffineTransformInvert: singular matrix.

и

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

Вот мой код:

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

- (void)viewDidAppear:(BOOL)animated { 

    [super viewDidAppear:animated]; 

} 

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

- (IBAction)takePhoto:(id)sender 
{ 

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
{ 
    UIImagePickerController *imagePicker =[[UIImagePickerController alloc] init]; 
    imagePicker.delegate = self; 
    imagePicker.sourceType =UIImagePickerControllerSourceTypeCamera; 
    imagePicker.mediaTypes = @[(NSString *) kUTTypeImage]; 
    imagePicker.allowsEditing = NO; 
    [self presentViewController:imagePicker 
         animated:YES completion:nil]; 
    _newMedia = YES; 
} 
} 


- (IBAction)selectPhoto:(id)sender 
{ 

if ([UIImagePickerController isSourceTypeAvailable: 
    UIImagePickerControllerSourceTypeSavedPhotosAlbum]) 
{ 
    UIImagePickerController *imagePicker = 
    [[UIImagePickerController alloc] init]; 
    imagePicker.delegate = self; 
    imagePicker.sourceType = 
    UIImagePickerControllerSourceTypePhotoLibrary; 
    imagePicker.mediaTypes = @[(NSString *) kUTTypeImage]; 
    imagePicker.allowsEditing = NO; 
    [self presentViewController:imagePicker 
         animated:YES completion:nil]; 
    _newMedia = NO; 
} 

} 

#pragma mark UIImagePickerControllerDelegate 

-(void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
NSString *mediaType = info[UIImagePickerControllerMediaType]; 

[self dismissViewControllerAnimated:YES completion:nil]; 

if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) { 
    UIImage *image = info[UIImagePickerControllerOriginalImage]; 

    _imageView.image = image; 
    if (_newMedia) 
     UIImageWriteToSavedPhotosAlbum(image, 
             self, 


    @selector(image:finishedSavingWithError:contextInfo:), 
             nil); 
} 
else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) 
{ 
    // Code here to support video if enabled 
} 
} 

-(void)image:(UIImage *)image finishedSavingWithError:(NSError *)error contextInfo:(void *)contextInfo 
{ 
if (error) { 
    UIAlertView *alert = [[UIAlertView alloc] 
          initWithTitle: @"Save failed" 
          message: @"Failed to save image" 
          delegate: nil 
          cancelButtonTitle:@"OK" 
          otherButtonTitles:nil]; 
    [alert show]; 
} 
} 

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 
{ 
[self dismissViewControllerAnimated:YES completion:nil]; 
} 
+0

интересно, выглядит как вопрос IOS. Я никогда не сталкивался с этим раньше, вы пробовали на других устройствах? – Jack

+0

Имеет ли ваше приложение разрешения камеры? –

ответ

0

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

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

Отметьте это сообщение; это может помочь вам ... UIImagePickerController error: Snapshotting a view that has not been rendered results in an empty snapshot in iOS 7

Вот полный код просто упаковывают, если вы что-то не хватает ...
ViewController.h

#import <UIKit/UIKit.h> 
@interface ViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> 
@property (nonatomic, weak) IBOutlet UIImageView *imageView; 
- (IBAction)takePhoto:(id)sender; 
- (IBAction)selectPhoto:(id)sender; 
@end 


ViewController.m

#import "ViewController.h" 
@import MobileCoreServices; 

@interface ViewController() 
@property (nonatomic, readwrite) BOOL newMedia; 
@end 

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

- (void)viewDidAppear:(BOOL)animated { 

    [super viewDidAppear:animated]; 

} 

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

- (IBAction)takePhoto:(id)sender 
{ 

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
    { 
     UIImagePickerController *imagePicker =[[UIImagePickerController alloc] init]; 
     imagePicker.delegate = self; 
     imagePicker.sourceType =UIImagePickerControllerSourceTypeCamera; 
     imagePicker.mediaTypes = @[(NSString *) kUTTypeImage]; 
     imagePicker.allowsEditing = NO; 
     [self presentViewController:imagePicker 
          animated:YES completion:nil]; 
     _newMedia = YES; 
    } 
} 


- (IBAction)selectPhoto:(id)sender 
{ 

    if ([UIImagePickerController isSourceTypeAvailable: 
     UIImagePickerControllerSourceTypeSavedPhotosAlbum]) 
    { 
     UIImagePickerController *imagePicker = 
     [[UIImagePickerController alloc] init]; 
     imagePicker.delegate = self; 
     imagePicker.sourceType = 
     UIImagePickerControllerSourceTypePhotoLibrary; 
     imagePicker.mediaTypes = @[(NSString *) kUTTypeImage]; 
     imagePicker.allowsEditing = NO; 
     [self presentViewController:imagePicker 
          animated:YES completion:nil]; 
     _newMedia = NO; 
    } 

} 

//- (IBAction)takePhoto_ 

#pragma mark UIImagePickerControllerDelegate 

-(void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    NSString *mediaType = info[UIImagePickerControllerMediaType]; 

    [self dismissViewControllerAnimated:YES completion:nil]; 

    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) { 
     UIImage *image = info[UIImagePickerControllerOriginalImage]; 

     _imageView.image = image; 
     if (_newMedia) 
      UIImageWriteToSavedPhotosAlbum(image, 
              self, 


              @selector(image:finishedSavingWithError:contextInfo:), 
              nil); 
    } 
    else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) 
    { 
     // Code here to support video if enabled 
    } 
} 

-(void)image:(UIImage *)image finishedSavingWithError:(NSError *)error contextInfo:(void *)contextInfo 
{ 
    if (error) { 
     UIAlertView *alert = [[UIAlertView alloc] 
           initWithTitle: @"Save failed" 
           message: @"Failed to save image" 
           delegate: nil 
           cancelButtonTitle:@"OK" 
           otherButtonTitles:nil]; 
     [alert show]; 
    } 
} 

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 
{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

@end 
+1

мой код я точно так же, как ваш. ive уже вижу сообщение, на которое вы ссылаетесь, но все же ни один из ответов не работает для меня –

+1

@ lucky13 не уверен, если вы решите эту ошибку, поздравляю, если вы это сделали, потому что она по-прежнему появляется сегодня в iOS8. Иногда он иногда появляется в примере с образцами Яблок. Вы можете попробовать запустить камеру после задержки.Я нахожу, что эта проблема часто возникает, если другие переходы все еще заканчиваются в фоновом режиме. – DevC

0

Я нашел решение своей проблемы благодаря замечанию DevC, указывающему мне в правильном направлении. Я использовал ActionSheet, чтобы представить UIImagePickerController, поэтому при нажатии на кнопку анимация все еще работает, пока сборщик открыт. я решил ее закрытия сборщика, прежде чем запускать код, который вызывает thepicker:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    [actionSheet dismissWithClickedButtonIndex:999 animated:NO]; //non-existing button index so it doesn't trigger anything again 

    // Rest of code here (UIImagePickerController trigger) 
} 
0

я столкнулся с той же проблемой. Если я скопирую код камеры в новый проект, он может работать хорошо. Поэтому я думаю, что это не проблема кода. Наконец, в моем проекте я обнаружил, что это вызвано сторонней библиотекой, которая находится в строке состояния.

self.MTStateBar = [[[MTStatusBarOverlay alloc] initWithFrame:CGRectMake(0, 0, 320, 20)] autorelease]; 

Я решил эту проблему, заменив его. Желание этого ответа может помочь вам.

0

UPDATE 3/15: используете ли вы UIActionSheet для отображения UIImagePickerController? Я решил это, заменив UIActionSheet на UIAlertController. Поскольку UIAlertView может приведет к неожиданным bugs.DO НЕ ИСПОЛЬЗОВАТЬ UIAlertView больше;)

Я думаю, что это ошибка Система IOS, вы можете задержать 0,5с представить UIImagePickerController, это работает для меня

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