1

cameraOverLayView をいじっていて、奇妙な動作に遭遇しました。UIImagePickerController を提示する前に、allowsEditing を 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];

}
4

1 に答える 1

0

重複の可能性: [camera takePhoto] を使用し、UIImagePicker を使用して編集するにはどうすればよいですか - UIImagePickerController.allowsEditing = YES

takePicture: によると、Apple ドキュメントのメソッド:

このメソッドをカスタム オーバーレイ ビューと組み合わせて使用​​して、プログラムによる静止画像のキャプチャを開始します。これにより、インターフェイスを離れずに複数の写真を撮ることができますが、デフォルトの画像ピッカー コントロールを非表示にする必要があります。

画像のキャプチャ中にこのメソッドを呼び出しても効果はありません。関連するデリゲート オブジェクトが imagePickerController:didFinishPickingMediaWithInfo: メッセージを受信するまで待ってから、別の画像をキャプチャする必要があります。

このアプローチ(カスタムオーバーレイ)は、自分で管理するために構成されているようです。「allowsEditing = YES」の場合でも、撮影した写真は直接 imagePickerController:didFinishPickingMediaWithInfo: に送信されます。

それに基づいて、カスタム ユーザー インターフェイスを使用して撮影した写真を編集する場合は、その目的に合わせてカスタム編集画面を作成する必要があります。

于 2013-07-31T04:27:29.260 に答える