Как создать камеру OverlayView
Я действительно изо всех сил пытаюсь понять, как это сделать. у меня есть UIImagePickerController
который отлично работает, но я хочу создать свой собственный CameraOverlayView
так что я могу настроить кнопки. Я не могу понять, как создать оверлей в первую очередь. Я пробовал так много уроков и пришел к следующему, но это далеко. Может кто-нибудь указать мне на простой следовать инструкциям?
- Я создал
UIImagePickerController
это работает со стандартными элементами управления - Для наложения я создал новый
UIViewController
на моей раскадровке и связал его с новым классом под названиемObViewControllerCameraOverlay
в
startCameraControllerFromViewController
метод я использую следующее, чтобы скрыть стандартные элементы управленияcameraUI.showsCameraControls=NO;
а затем это, чтобы показать cameraOverlay (который не компилируется)
obViewControllerCameraOverlay * overlay = [[obViewControllerCameraOverlay alloc]; cameraUI.cameraOverlayView = overlay;
Я знаю, что я делаю это неправильно, но я озадачен тем, как это работает. Я тоже смотрел на PhotoPicker от Apple, но просто не понимаю.
ОБНОВИТЬ:
Где я сейчас нахожусь - может кто-нибудь сказать мне, если это правильный процесс (я понимаю, что размер кадра должен быть отсортирован, и пользовательские кнопки должны быть добавлены как-то):
.m файл, где 'Сфотографируйте' UIButton
расположен.
@property (nonatomic, strong) UIView *overlay;
- (IBAction)takePhoto:(id)sender
{
[self startCameraControllerFromViewController: self usingDelegate: self];
}
- (BOOL) startCameraControllerFromViewController: (UIViewController*) controller usingDelegate: (id <UIImagePickerControllerDelegate, UINavigationControllerDelegate>) delegate
{
if (([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera] == NO) || (delegate == nil) || (controller == nil)) return NO;
UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;
cameraUI.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerCameraCaptureModePhoto];
cameraUI.showsCameraControls=NO;
overlay = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
cameraUI.cameraOverlayView = overlay;
cameraUI.allowsEditing = NO;
cameraUI.delegate = delegate;
[controller presentViewController:cameraUI animated:YES completion:nil];
return YES;
}
2 ответа
Ваш overlay
только выделено - не инициализировано. Он должен быть инициализирован, и его кадр должен быть правильно установлен.
Также: overlayView
должно быть UIView *
тип. Если вы хотите передать UIViewController
в качестве наложения вы должны передать только это view
имущество.
Например:
obViewControllerCameraOverlay *overlay = [storyboard instantiateViewControllerWithIdentifier: @"obViewControllerCameraOverlay"];
cameraUI.cameraOverlayView = overlay.view;
Вы должны изменить код, конечно, в соответствии с вашим проектом и конфигурацией.
Я довольно поздно к этому, но вот мой код, который я использовал для создания UIImagePickerController и CameraOverlayView. Если вы хотите, чтобы камера появлялась сразу после открытия контроллера представления, убедитесь, что вы инициализировали UIImagePickerController в viewDidAppear, как я это сделал (viewDidLoad не работает).
@interface CameraViewController ()
@property UIImagePickerController *PickerController;
@property CGFloat HeightOfButtons;
@end
- (UIView *)createCustomOverlayView
{
// Main overlay view created
UIView *main_overlay_view = [[UIView alloc] initWithFrame:self.view.bounds];
// Clear view (live camera feed) created and added to main overlay view
// ------------------------------------------------------------------------
UIView *clear_view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - self.HeightOfButtons)];
clear_view.opaque = NO;
clear_view.backgroundColor = [UIColor clearColor];
[main_overlay_view addSubview:clear_view];
// ------------------------------------------------------------------------
// Creates two red buttons on the bottom of the view (on top of the live camera feed)
// Then adds the buttons to the main overlay view
// You can, of course, customize these buttons however you want
// ------------------------------------------------------------------------
for(int i = 0; i < 2; i++) {
self.HeightOfButtons = 100;
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
// when a button is touched, UIImagePickerController snaps a picture
[button addTarget:self action:@selector(testIfButtonResponds) forControlEvents:UIControlEventTouchUpInside];
button.frame = CGRectMake( i * self.view.frame.size.width / 2, self.view.frame.size.height - self.HeightOfButtons, self.view.frame.size.width / 2, self.HeightOfButtons);
[button setBackgroundColor:[UIColor redColor]];
[main_overlay_view addSubview:button];
}
// ------------------------------------------------------------------------
return main_overlay_view;
}
- (void)makeCustomCameraAppear
{
self.PickerController = [[UIImagePickerController alloc] init];
self.PickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
self.PickerController.showsCameraControls = NO;
self.PickerController.delegate = self;
UIView *overlay_view = [self createCustomOverlayView];
[self.PickerController setCameraOverlayView:overlay_view];
[self presentViewController:self.PickerController animated:YES completion:NULL];
}
- (void)viewDidAppear:(BOOL)animated
{
[self makeCustomCameraAppear];
}