0

iOS 6.1では、 UITabBarの 1 つのタブに非モーダルにUIImagePickerControllerを表示しています

私の初期設定で:

self.picker = [[UIImagePickerController alloc] init];
self.picker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.picker.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
self.picker.delegate = self;
self.picker.allowsEditing = NO;
[self.view addSubview:self.picker.view];

私は実装しました:

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    return;
}

私は電話したことがないので:

[picker presentViewController:(UIViewController *) animated:(BOOL) completion:^(void)completion];

電話する必要はありません:

[picker dismissViewControllerAnimated:NO completion:nil];

しかし、キャンセルボタンを押すと、キャンセルボタンがグレー表示され、UIImagePickerControllerがロックされているように見えます。画像/ビデオの切り替えやカメラの反転ボタンなど、一部のコントロールは機能しますが、写真を撮るボタンはフリーズしています。

別のタブに移動して [カメラ] タブに戻ると、UIImagePickerControllerがリセットされ、再び正常になります。この場合に実行されるコードは、viewWillAppearviewDidAppearだけで、この状況に関連するものは何もありません。

iOS 7では、[キャンセル] ボタンを押しても何もロックされません。

UIImagePickerControllerは常にタブに表示されるため、キャンセル ボタンは必要ありません。

  • [キャンセル] ボタンを非表示または無効にする
  • ロックアップしないようにimagePickerControllerDidCancelを実装する
4

1 に答える 1

0

カメラ オーバーレイ ビューを実装すると、問題なく動作します。

    self.picker = [[UIImagePickerController alloc] init];
    self.picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    self.picker.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
    self.picker.delegate = self;
    self.picker.allowsEditing = NO;
    self.picker.showsCameraControls = NO;

    UIView *clearView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    clearView.opaque = NO;
    clearView.backgroundColor = [UIColor clearColor];

    UIToolbar *toolBar=[[UIToolbar alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height-self.tabBarController.tabBar.frame.size.height-55, self.view.frame.size.width, 55)];
    toolBar.barStyle =  UIBarStyleBlackOpaque;
    NSArray *items=[NSArray arrayWithObjects:
                    [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
                    [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(takePicture)],
                    [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
                    nil];
    [toolBar setItems:items];

    UIView *overlayView = [[UIView alloc] initWithFrame:self.view.bounds];
    [overlayView addSubview:clearView];
    [overlayView addSubview:toolBar];

    [self.picker setCameraOverlayView:overlayView];

    [self.view addSubview:self.picker.view];

[[UIBarButtonItem alloc] ... action:@selector(takePicture)],

- (void)takePicture
{
    [self.picker takePicture]; // triggers didFinishPickingMediaWithInfo
}

UIImagePickerControllerDelegate

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    if (image != nil)
    {
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    }
}
于 2014-09-23T20:55:16.537 に答える