Как узнать, завершена ли анимация запуска «iris» UIImagePickerController?

#animation #uiimagepickercontroller

#Анимация #uiimagepickercontroller

Вопрос:

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

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

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

У кого-нибудь есть подсказка?

Ответ №1:

Анимация iris запускается в [UIImagePickerController viewDidAppear] методе. Apple не рекомендует создавать подклассы UIImagePickerController по целому ряду причин, но если вам нужно добавить наложение после завершения анимации iris и вы не хотите писать свой собственный класс захвата изображения с помощью 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 методе делегирования на контроллере панели вкладок очистите средство выбора изображений и отправьте информационный словарь на ваш контроллер просмотра камеры, чтобы обработать изображение так, как вам нужно:

 - (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]; here приведет к повторной инициализации UIImagePickerController , которую вы можете захотеть, а можете и не захотеть делать здесь. Я бы, скорее всего, просто #import "my_TabBarViewController.h в вашем yourCameraViewController , а затем вы могли бы захватить указатель на picker в вашем UIImagePickerController методе делегирования, вызвав:

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

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