拍照后无法选择“使用照片”或“重新拍摄”。

11

我正在尝试为iOS 7更新应用程序,并且在我的自定义覆盖层上遇到问题。该覆盖层是一个图像,我使用它来给照片加框(无论是实时的还是使用完整分辨率版本来框定相机卷中的最终结果)。问题是,在iOS 7下,虽然底部透明,但该覆盖层提供了访问常规“拍照”按钮的权限,但由于某种原因,不允许我点击拍摄后出现的“使用照片”或“重拍”按钮。以下是调用视图控制器的代码片段:

- (IBAction)takePhoto:(UIButton *)sender {

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = NO;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.showsCameraControls = YES;

// Overlay Creation
UIView* overlayView = [[UIView alloc] initWithFrame:picker.view.frame];
    overlayView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"PBOverlayView.png"]];
    [overlayView.layer setOpaque:NO];
    overlayView.opaque = NO;

picker.cameraOverlayView = overlayView;

[self presentViewController:picker animated:YES completion:NULL];

}

picker.allowsEditing = YES; - Rajneesh071
4个回答

12
另一种方法可能是观察ImagePicker更改状态时的通知,并在进入“使用照片”屏幕时移除(或禁用)您的覆盖层。

另一种方法可能是观察ImagePicker更改状态时的通知,并在进入“使用照片”屏幕时移除(或禁用)您的覆盖层。

- (void) addPhotoObservers {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeCameraOverlay) name:@"_UIImagePickerControllerUserDidCaptureItem" object:nil ];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addCameraOverlay) name:@"_UIImagePickerControllerUserDidRejectItem" object:nil ];
}

- (void) removePhotoObservers {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

-(void)addCameraOverlay {
    if (self.cameraPicker) {
        self.cameraPicker.cameraOverlayView = self.myCameraOverlayView;
    }
}

-(void)removeCameraOverlay {
    if (self.cameraPicker) {
        self.cameraPicker.cameraOverlayView = nil;
    }
}

这些观察者在捕获“重新拍摄”和“使用预览”点击时非常有帮助。你会认为苹果会为这些提供回调函数。 - whyoz
1
谢谢。但是当我重新拍照时,叠加层没有显示出来,为了解决这个问题,我只需在addCameraOverlay和removeCameraOverlay中将if内容更改为self.cameraPicker.cameraOverlayView.hidden=NO和self.cameraPicker.cameraOverlayView=YES。 - VIjay J

8
你可以将叠加视图中的 User Enteraction Enabled 设置为 NO ;) 在我这里有效。

5
您的问题:在初始化overlayView时,您将框架设置为与选择器相同的大小。 UIView* overlayView = [[UIView alloc] initWithFrame:picker.view.frame]; 说明:在捕获图像之前,相机按钮位于overlayView的前景中,因此按下它们没有问题。在捕获图像后(在“重新拍摄/使用预览页面”上),overlayView是要处于前景的,从而阻止了访问这些按钮。我知道这是iOS7的一个问题,不确定其他版本。
可能的解决方案:由于这是Apple的UIImagePickerController内部问题,我只能想到两个解决方案:(1)如果可能,配置overlayView具有较短的框架,不覆盖选择器的底部;(2)如果您需要覆盖这些按钮,则仍然可以选择配置self.imagePicker.showsCameraControls = NO;,但然后您必须自定义所有相机行为(您可以在网上找到许多示例)。

或者你可以在覆盖视图上将用户交互启用设置为NO ;) 对我有效 - Vahan

0
在拍照或覆盖层动画完成后,我通过将覆盖层从其父视图中移除来使其正常工作。
[UIView animateWithDuration:1
                      delay:1
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^{

                 } completion:^(BOOL finished) {
                     [self.view removeFromSuperview];
                 }];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接