Как определить, когда пользователь нажал кнопку «Запись» в UIImagePickerController? - PullRequest
1 голос
/ 06 февраля 2011

Я хотел бы показать обратный отсчет, когда пользователь нажимает кнопку записи в контроллере UIImagePicker, но нет метода делегата, сообщающего нам, когда они нажимают на запись. Я могу установить максимальную длительность, но я хотел бы дать 1-минутное предупреждение или что-то подобное, но я не уверен, как это сделать

videoPickerCtrl = [[UIImagePickerController alloc] init];
videoPickerCtrl.delegate = self;
videoPickerCtrl.sourceType =      UIImagePickerControllerSourceTypeCamera;
videoPickerCtrl.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:videoPickerCtrl.sourceType];   
videoPickerCtrl.allowsEditing = NO;
videoPickerCtrl.videoMaximumDuration = 170;
videoPickerCtrl.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeMovie];

EDIT:

Я не смог найти решение этой проблемы, поэтому я создал свой собственный контроллер видеозахвата. Надеюсь, кто-то еще может найти это полезным: https://github.com/saliksyed/CustomVideoCapture

Ответы [ 5 ]

0 голосов
/ 22 февраля 2014

В идеальном мире вы бы хотели, чтобы Apple предоставила всего пару делегатов, которые сделали бы это.Например:

  • (void) imagePickerControllerDidStartVideoCapturing: (UIImagePickerController *) средство выбора
  • (void) imagePickerControllerDidStopVideoCapturing: (UIImagePickerCerroller) * 100 * * 100 *согласно документации Apple):
    • Протокол для UIImagePickerController слишком прост, чтобы сделать это
    • Этот класс предназначен для использования как есть и не поддерживает подклассы
    • Иерархия представлений для этого класса является закрытой и не подлежит изменению.

    В документации также говорится: «Вы можете назначить настраиваемое представление свойству cameraOverlayView и использовать это представление для представления дополнительной информации или управлениявзаимодействие между интерфейсом камеры и вашим кодом ".

    В моем приложении мне нужно было представить" UIProgressView ", чтобы указать, как долго видео может быть записано.Для этого мне нужно было определить момент начала захвата видео.

    Я не хотел отключать встроенные элементы управления камерой, потому что они крутые, и я ленив, так что я не хотел тратить много времени на изобретение колеса.Просто все, что мне было нужно, это зафиксировать тот факт, что большая КРАСНАЯ кнопка была нажата, чтобы начать или остановить запись.

    Мое решение состояло в том, чтобы "накрыть" исходную кнопку начала / остановки записи пользовательским представлением и включить взаимодействие с пользователем.для этого представления следующим образом:

    overlayView = [[UIView alloc] initWithFrame:self.view.frame];
    
    // Start/ Stop fake button
    UIView *ssView = [[UIView alloc] initWithFrame:CGRectMake(self.view.frame.size.width / 2 - 35, self.view.frame.size.height - 71, 70, 70)];
    [ssView setUserInteractionEnabled:YES];
    
    // Background color below is only there to make sure my pseudo-button overlaps native Start/Stop button. Comment out the line below to leave it transparent
    [ssView setBackgroundColor:[UIColor colorWithRed:0 green:1 blue:0 alpha:0.5f]];
    
    UITapGestureRecognizer *t = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
    [ssView addGestureRecognizer:t];
    
    [overlayView addSubview:ssView];  
    
    // My own progress bar
    UIProgressView *p = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
    [p setTintColor:[UIColor redColor]];
    [p setCenter:CGPointMake(30, 130)];
    [p setTransform:CGAffineTransformMakeRotation( M_PI / 2 )];
    [p setProgress:0];
    
    [overlayView addSubview:p];
    
    pickerController.cameraOverlayView = overlayView;
    

    Затем я определил обработчик событий для крана следующим образом:

    -(void)tapped:(id)sender {
    
        if (isRecording) {
            [pickerController stopVideoCapture];
            NSLog(@"Video capturing stopped...");
            // add your business logic here ie stop updating progress bar etc...
            [pickerController.cameraOverlayView setHidden:YES];
            isRecording = NO;
            return;
        }
    
        if ([pickerController startVideoCapture]) {
            NSLog(@"Video capturing started...");
            // add your business logic here ie start updating progress bar etc...
            isRecording = YES;
        }
    
    }
    

    Полный код файла интерфейса:

    #import <UIKit/UIKit.h>
    #import <MobileCoreServices/MobileCoreServices.h>
    
    @interface ViewController : UIViewController <UIImagePickerControllerDelegate>
    - (IBAction)openCamera:(id)sender;
    
    @end
    

    Файл реализации:

    #import "ViewController.h"
    
    @interface ViewController () {
        UIImagePickerController *pickerController;
        UIView* overlayView;
        BOOL isRecording;
    }
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
        isRecording = NO;
    
        pickerController = [[UIImagePickerController alloc] init];
        pickerController.delegate = self;
        pickerController.allowsEditing = NO;
        pickerController.videoMaximumDuration = 30.0f;
        pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
        pickerController.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];
    
        // I want default controls be available here...
        pickerController.showsCameraControls = YES;
    
        overlayView = [[UIView alloc] initWithFrame:self.view.frame];
    
        // Start/ Stop fake button
        UIView *ssView = [[UIView alloc] initWithFrame:CGRectMake(self.view.frame.size.width / 2 - 35, self.view.frame.size.height - 71, 70, 70)];
        [ssView setUserInteractionEnabled:YES];
        // Background color below is only there to make sure myt pseudo-button overlaps native Start/Stop button
        [ssView setBackgroundColor:[UIColor colorWithRed:0 green:1 blue:0 alpha:0.5f]];
    
       UITapGestureRecognizer *t = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
       [ssView addGestureRecognizer:t];
    
       [overlayView addSubview:ssView];
    
       // My own progress bar
       UIProgressView *p = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
       [p setTintColor:[UIColor redColor]];
       [p setCenter:CGPointMake(30, 130)];
       [p setTransform:CGAffineTransformMakeRotation( M_PI / 2 )];
       [p setProgress:0];
    
       [overlayView addSubview:p];
    
       pickerController.cameraOverlayView = overlayView;
    
    }
    
    - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
        // Cancel button tapped
        [picker dismissViewControllerAnimated:YES completion:nil];
    }
    
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    
        NSLog(@"Got image : %@", info);
        [picker dismissViewControllerAnimated:YES completion:nil];
    
        // Do something with video captured
    }
    
    -(void)tapped:(id)sender {
    
        if (isRecording) {
            [pickerController stopVideoCapture];
            NSLog(@"Video capturing stopped...");
            // add your business logic here ie stop updating progress bar etc...
            [pickerController.cameraOverlayView setHidden:YES];
            isRecording = NO;
            return;
        }
    
        if ([pickerController startVideoCapture]) {
            NSLog(@"Video capturing started...");
            // add your business logic here ie start updating progress bar etc...
            isRecording = YES;
        }
    
    }
    
    - (IBAction)openCamera:(id)sender {
        [pickerController.cameraOverlayView setHidden:NO];
        [self presentViewController:pickerController animated:YES completion:nil];    
    }
    @end
    

    Возможно, вы заметили, что я скрываю cameraOverlayView, как только захват видео остановлен.

    [pickerController.cameraOverlayView setHidden:YES];
    

    Это позволяет "Retake / Play and Use" nativeуправляет работой после записи видео.

0 голосов
/ 05 ноября 2013

Для всех остальных это может быть сделано, если вы используете пользовательский вид наложения на UIImagePickerController. Просто добавьте все элементы управления, которые вы хотите видеть, а затем установите родительский вид на свойство cameraOverlayView.

0 голосов
/ 09 февраля 2011

Хорошо. Так что я уверен, что то, чего я хочу достичь, просто невозможно. Я собираюсь просто заново создать стандартный интерфейс UIImagePickerController для видео, используя AVFoundation в качестве бэкэнда. Надеюсь, как только это будет сделано, я выложу его на github или что-то в этом роде.

0 голосов
/ 21 февраля 2011

Я создал тот же эффект, который вы ищете, используя пользовательский вид наложения.

Вам необходимо создать модальное окно с экземпляром UIVideoEditorController, у которого свойство videoPath является ключом UIImagePickerControllerMediaURL в userInfo из метода imagePickerController:didFinishPickingMediaWithInfo:, который вы должны обрабатывать.

НТН

0 голосов
/ 06 февраля 2011

Вы не получите уведомление, когда пользователь нажимает кнопку, но вы можете предоставить свою собственную кнопку записи: настройте средство выбора изображений, чтобы скрыть его стандартные элементы управления (showsCameraControls) и предоставьте настраиваемый вид наложения (cameraOverlayView).В этом представлении наложения поместите пользовательскую кнопку, которую вы подключаете к цели / действию, и в метод действия, который вы называете -startVideoCapture.

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