Почему мой интерфейс камеры работает странно, когда я использую UIImagePickerController? - PullRequest
7 голосов
/ 20 октября 2011

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

    - (void)PictureAlert:(id)sender {

    UIAlertView *AlertDialog;

    // Setting up AlertDialog.
    AlertDialog = [[UIAlertView alloc] initWithTitle:nil 
                                             message:nil 
                                            delegate:self 
                                   cancelButtonTitle:@"Cancel" 
                                   otherButtonTitles:@"Choose From Library", @"Take New Picture", nil];

    [AlertDialog show]; }

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

    NSString *ButtonTitle = [alertView buttonTitleAtIndex:buttonIndex];

    if ([ButtonTitle isEqualToString:@"Choose From Library"]) {

        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {

            // Pick photo.
            UIImagePickerController *picker = [[UIImagePickerController alloc] init];
            picker.delegate = self;
            picker.allowsEditing = YES;
            picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;

            [self presentModalViewController:picker animated:YES];


        } else if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {

            // Setting up AlertDialog.
            UIAlertView *AlertDialog;

            AlertDialog = [[UIAlertView alloc] initWithTitle:@"Error accessing photo library" 
                                                     message:@"Device does not support a photo library"  
                                                    delegate:self 
                                           cancelButtonTitle:@"Dismiss" 
                                           otherButtonTitles:nil];

            [AlertDialog show];

        }


    } else if ([ButtonTitle isEqualToString:@"Take New Picture"]) {

        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

            // Take new photo.
            UIImagePickerController *picker = [[UIImagePickerController alloc] init];
            picker.delegate = self;
            picker.allowsEditing = YES;
            picker.wantsFullScreenLayout = YES;
            picker.sourceType = UIImagePickerControllerSourceTypeCamera;

            [self presentModalViewController:picker animated:YES];


        } else if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

            // Setting up AlertDialog.
            UIAlertView *AlertDialog;

            AlertDialog = [[UIAlertView alloc] initWithTitle:@"Error accessing camera" 
                                                     message:@"Device does not support a camera"  
                                                    delegate:self 
                                           cancelButtonTitle:@"Dismiss" 
                                           otherButtonTitles:nil];

            [AlertDialog show];

        }

    }

}

Проблема в том, что если пользователь хочет сделать новый снимок, появляется интерфейс камеры, а затем, если вы поворачиваете устройство, интерфейс выглядит следующим образом:enter image description here

А затем, когда пользователь поворачивает его назад, он внезапно выглядит следующим образом: enter image description here

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

Любые мысли приветствуются:)

Ответы [ 4 ]

1 голос
/ 16 ноября 2011

Несколько вещей, которые вы можете рассмотреть:

  1. Если для свойства wantsFullScreenLayout установлено значение YES, представление будет игнорировать строку состояния. Но так как вы используете стандартные элементы управления камерой, строка состояния автоматически скрывается. Это наиболее вероятная причина появления серой области размером 20 пикселей внизу изображения.

  2. Элементы управления камерой по умолчанию предназначены только для портретного режима. Поскольку ваше первое изображение выглядит так, как будто вы как-то повернули экран, вам следует изучить свой код (вероятно, shouldAutoRotate) и понять, почему вы поворачиваете представление таким образом. Это должно решить проблему увеличения, которое вы получаете на вашем альбомном изображении.

  3. У вас будут утечки памяти, если вы создадите UIImagePickerController, представите его, а затем не будете иметь ссылки на него, чтобы выпустить его позже. Я бы порекомендовал установить UIImagePickerController в интерфейсе и настроить его методом viewDidLoad. Попробуйте:

.h

@interface yourView:UIViewController <UIImagePickerControllerDelegate> {
  UIImagePickerController * picker;
}

.m

- (void)dealloc; {
  [picker release];
  [super dealloc];
}

- (void)viewDidLoad; {
  [super viewDidLoad];
  picker = [[UIImagePickerController alloc] init];
  picker.delegate = self;
  picker.allowsEditing = YES;
  picker.sourceType = UIImagePickerControllerSourceTypeCamera;
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex; {
  NSString *ButtonTitle = [alertView buttonTitleAtIndex:buttonIndex];

  if([ButtonTitle isEqualToString:@"Choose From Library"]){
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){
      picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
      [self presentModalViewController:picker animated:YES];
    }
    else{
      // Setting up AlertDialog.
      UIAlertView *AlertDialog;
      AlertDialog = [[UIAlertView alloc] initWithTitle:@"Error accessing camera" 
                                               message:@"Device does not support a camera"  
                                              delegate:self 
                                     cancelButtonTitle:@"Dismiss" 
                                     otherButtonTitles:nil];
      [AlertDialog show];
      [AlertDialog release];
    }
  }
  else if([ButtonTitle isEqualToString:@"Take New Picture"]){
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
      picker.sourceType = UIImagePickerControllerSourceTypeCamera;
      [self presentModalViewController:picker animated:YES];
    }
    else{
      // Setting up AlertDialog.
      UIAlertView *AlertDialog;
      AlertDialog = [[UIAlertView alloc] initWithTitle:@"Error accessing camera" 
                                               message:@"Device does not support a camera"  
                                              delegate:self 
                                     cancelButtonTitle:@"Dismiss" 
                                     otherButtonTitles:nil];
      [AlertDialog show];
      [AlertDialog release];
    }
  }
}

Это должно устранить утечки памяти и улучшить время загрузки. Надеюсь, что поможет!

0 голосов
/ 16 ноября 2011

Похоже, что для моего проекта это происходило, потому что вы не написали метод shouldAutoRotateToInterface: в вашем корневом контроллере представления. Сообщение поворота распространяется вплоть до делегата mustAutoRotateToInterface контроллера корневого представления, когда вызывается UIImagePickerController. Ваш метод должен выглядеть так:

- (BOOL)shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

Когда я обновил свой проект до iOS 5, я позаимствовал свой контроллер корневого представления из проекта iOS 3. iOS 3 не записывает этот метод автоматически в классах контроллеров представления. Попробуйте и дайте мне знать.

0 голосов
/ 10 ноября 2011

Убедитесь, что вы установили иерархию контроллера представления с mainWindow.rootViewController и [vc addChildViewController:].Это распространяет информацию об ориентации туда, где вам это нужно.

0 голосов
/ 20 октября 2011

Некоторое время это происходило, если вы используете iphone старого поколения, на котором установлена ​​текущая операционная система, например, у вас есть iphone 3G, и вы обновляете его ios на ios5, тогда некоторые из установленных вами приложений могут вести себя по-другому, вы можете проверить свое приложение на другом. Устройство для устранения вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...