Как узнать, закончилась ли анимация запуска "радужной оболочки" UIImagePickerController? - PullRequest
4 голосов
/ 29 апреля 2011

Эй, ребята ... нужна помощь здесь ... действительно не могу найти в Google ...

У меня есть приложение с вкладками, которое на одной из этих вкладок покажет UIImagePickerController для получения изображения с камеры ... Я использую вид наложения, но когда камере требуется почти 3 секунды, чтобы "открыть" их "(запуск анимации), мой оверлейный вид уже виден над закрытой радужной оболочкой !!!

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

Я прочитал несколько постов о создании подкласса UIImagePickerController, но Apple сказала, что мы не должны делать это с UIImagePickerController ....

У кого-нибудь есть подсказка? я действительно потерян здесь ...

Thx

1 Ответ

0 голосов
/ 22 января 2013

Анимация радужной оболочки запускается по методу [UIImagePickerController viewDidAppear]. Apple не рекомендует создавать подклассы UIImagePickerController по ряду причин, но если вам нужно добавить оверлей после завершения анимации радужной оболочки и не хотите писать собственный класс Image Capture с AVFoundation, я бы сделал что-то вроде этого:

Если у вас его еще нет, добавьте новый подкласс UITabBarViewController с UIImagePickerController @property и делегатами для UIImagePickerControllerDelegate и UINavigationControllerDelegate

@interface my_TabBarViewController : UITabBarController <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
@property (nonatomic, strong) UIImagePickerController *picker;

В реализации добавьте метод initCamera и вызовите его в вашем viewDidLoad

- (void)initCamera
{

  _picker                     = [[UIImagePickerController alloc] init];
  _picker.sourceType          = UIImagePickerControllerSourceTypeCamera;
  _picker.view.frame          = CGRectMake(0.f, 20.f, 320.f, 499.f);
  _picker.navigationBarHidden = TRUE;
  _picker.delegate            = self;
  _picker.cameraOverlayView   = YourCameraOverlayView;
  [self.view addSubview:_picker.view];
  [_picker viewDidAppear:FALSE];

  [self.view sendSubviewToBack:_picker.view];

}

Затем, когда коснитесь элемента панели вкладок вида камеры, покажите камеру таким способом на контроллере панели вкладок:

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
  NSLog(@"tapped: %@", item.title);

  if ([item.title isEqualToString:@"Camera"]) {
    [self.view bringSubviewToFront:_picker.view];
  } else {
    [self.view sendSubviewToBack:_picker.view];
  }
}

Наконец, в вашем методе делегирования UIImagePickerController на контроллере панели вкладок очистите средство выбора изображений и отправьте информационный словарь на контроллер Camera View для обработки изображения, однако вам необходимо:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
  [_picker.view removeFromSuperview];

  yourCameraViewController *camVC = (yourCameraViewController*)[self.viewControllers objectAtIndex:1];
  // Index 1 would just be the second tab, adjust accordingly
  [camVC imagePickerController:picker didFinishPickingMediaWithInfo:info];

  [self initCamera];
}

Вызов [self initCamera]; здесь приведет к повторной инициализации UIImagePickerController, который вы можете или не хотите делать здесь. Я бы, вероятно, просто #import "my_TabBarViewController.h в вашем yourCameraViewController, а затем вы могли бы получить указатель на picker в вашем UIImagePickerController методе делегата, вызвав:

my_TabBarViewController *tabBarVC = (my_TabBarViewController*)self.tabBarController;

и yourCameraViewController отклоните его и отправьте сообщение tabBarVC, чтобы повторно запустить UIImagePickerController, когда вам это понадобится снова.

...