UIImagePickerController не показывает экран редактирования

Я играю с cameraOverLayView и столкнулся со странным поведением. Перед представлением UIImagePickerController я установил для параметра allowEditing значение YES. После того, как появляется экран захвата, я нажимаю на кнопку, которая вызывает takePicture(). Вместо представления экрана редактирования метод делегата didFinishPickingMediaWithInfo() вызывается сразу. Может ли кто-нибудь помочь мне понять, что я могу делать неправильно? Я вставил часть своего кода ниже...

Спасибо!

    - (BOOL)shouldStartCameraController {

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO) {
        return NO;
    }

    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
    float overlayOffset = 0;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        if (screenSize.height > 480.0f) {
            overlayOffset = 195;
        } else {
            overlayOffset = 103;
        }
    } else {
        /*Do iPad stuff here.*/
    }


    UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]
        && [[UIImagePickerController availableMediaTypesForSourceType:
             UIImagePickerControllerSourceTypeCamera] containsObject:(NSString *)kUTTypeImage]) {

        cameraUI.mediaTypes = [NSArray arrayWithObject:(NSString *) kUTTypeImage];
        cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;

        if ([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]) {
            cameraUI.cameraDevice = UIImagePickerControllerCameraDeviceRear;
        } else if ([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]) {
            cameraUI.cameraDevice = UIImagePickerControllerCameraDeviceFront;
        }

    } else {
        return NO;
    }


    UIView *cameraOverlayView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cameraUI.view.frame.size.width, cameraUI.view.frame.size.height)];
    UIImageView *cameraOverlayImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"iphone5_camera_overlay.png"]];
    cameraOverlayImageView.frame = CGRectMake(0, 0, cameraUI.view.frame.size.width, cameraUI.view.frame.size.height);
    [cameraOverlayView addSubview:cameraOverlayImageView];


    UILabel *cameraLabel = [[UILabel alloc] initWithFrame:CGRectMake( 0.0f, self.view.bounds.size.height-overlayOffset, self.view.bounds.size.width, 50.0f)];
    [cameraLabel setTextAlignment:NSTextAlignmentCenter];
    [cameraLabel setBackgroundColor:[UIColor clearColor]];
    [cameraLabel setTextColor:[UIColor whiteColor]];
    [cameraLabel setShadowColor:[UIColor colorWithWhite:0.0f alpha:0.300f]];
    [cameraLabel setShadowOffset:CGSizeMake( 0.0f, -1.0f)];
    [cameraLabel setFont:[UIFont boldSystemFontOfSize:18.0f]];
    [cameraOverlayView addSubview:cameraLabel];

    UIButton *cancelButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [cancelButton addTarget:self action:@selector(cancelButtonPressed:) forControlEvents:UIControlEventTouchDown];
    [cancelButton setFrame:CGRectMake(10, cameraOverlayView.frame.size.height-60, 50, 50)];
    [cancelButton setBackgroundColor:[[UIColor whiteColor] colorWithAlphaComponent:0.5f]];
    [cameraOverlayView addSubview:cancelButton];


    UIButton *snapButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [snapButton addTarget:self action:@selector(takePictureButtonPressed:) forControlEvents:UIControlEventTouchDown];
    [snapButton setFrame:CGRectMake(110, cameraOverlayView.frame.size.height-60, 100, 50)];
    [snapButton setBackgroundColor:[[UIColor whiteColor] colorWithAlphaComponent:0.5f]];
    [cameraOverlayView addSubview:snapButton];
    cameraUI.allowsEditing = YES;
    cameraUI.showsCameraControls = NO;
    cameraUI.delegate = self;
    self.imagePickerController = cameraUI;

    [self presentModalViewController:cameraUI animated:YES];

    return YES;
}


- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer {
    [self shouldPresentPhotoCaptureController];
}

#pragma mark - UIBarButton Selectors

- (void)takePictureButtonPressed:(id)sender {
    NSLog(@"takePictureButtonPressed...");
    // TODO: take picture!
    [self.imagePickerController takePicture];

}

1 ответ

Возможное повторение: как использовать [camera takePhoto] и редактировать с помощью UIImagePicker - UIImagePickerController.allowsEditing = YES

Согласно takePicture: метод в документации Apple:

Используйте этот метод в сочетании с настраиваемым видом наложения, чтобы инициировать программный захват неподвижного изображения. Это позволяет делать несколько снимков, не выходя из интерфейса, но требует, чтобы вы скрыли стандартные средства выбора изображений по умолчанию.

Вызов этого метода во время захвата изображения не имеет никакого эффекта. Необходимо подождать, пока связанный объект делегата не получит сообщение imagePickerController: didFinishPickingMediaWithInfo:, прежде чем вы сможете захватить другое изображение.

Кажется, что этот подход (пользовательское наложение) настроен для того, чтобы им можно было управлять самостоятельно. Даже если "allowEditing = YES", сделанный снимок будет напрямую отправлен в imagePickerController:didFinishPickingMediaWithInfo:.

Исходя из этого, если мы хотим отредактировать снимок с помощью нашего пользовательского интерфейса, мы должны создать соответствующий экран для этой цели.

Другие вопросы по тегам