Анимация радужной оболочки запускается по методу [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
, когда вам это понадобится снова.