#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
когда вам это снова понадобится.