Ios 使用UIImagePickerController使UIView显示摄影机视图

Ios 使用UIImagePickerController使UIView显示摄影机视图,ios,objective-c,uiview,camera,uiimagepickercontroller,Ios,Objective C,Uiview,Camera,Uiimagepickercontroller,我正在尝试将相机看到的图像显示到我自己的自定义视图中。我不想为UIImagePickerController使用苹果自己的overlay属性:cameraOverlayView 我不想要一个覆盖,但它只是显示在我的特定视图。我能做到这一点的唯一方法是在UIView中创建一个子视图,但这样做不允许我使用在UIView上制作的任何自定义按钮。到目前为止,我的代码是: UIImagePickerController *imagePickerController = [[UIImagePickerCon

我正在尝试将相机看到的图像显示到我自己的自定义视图中。我不想为UIImagePickerController使用苹果自己的overlay属性:cameraOverlayView

我不想要一个覆盖,但它只是显示在我的特定视图。我能做到这一点的唯一方法是在UIView中创建一个子视图,但这样做不允许我使用在UIView上制作的任何自定义按钮。到目前为止,我的代码是:

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];

[imagePickerController setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePickerController setShowsCameraControls:NO];
[imagePickerController setEditing:NO];
[imagePickerController setNavigationBarHidden:YES];

[self.videoPreviewView addSubview:[imagePickerController view]];
[imagePickerController viewWillAppear:YES];
其中videoPreviewView是我的UIView的出口


有什么建议吗?谢谢

希望它能起作用,我刚刚添加了一个视图,您可以将任何自定义对象添加到选择器的overlayview中

   if ([UIImagePickerController isSourceTypeAvailable:
     UIImagePickerControllerSourceTypeCamera]){
    imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType =
    UIImagePickerControllerSourceTypeCamera;
    imagePicker.showsCameraControls = NO;
    imagePicker.allowsEditing = NO;

    NSString *nibName = @"CameraView";

    NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:nibName
                                                  owner:nil
                                                options:nil];
    if([nibs count]){
        id nib = [nibs objectAtIndex:0];
        if([nib isKindOfClass:[CameraView class]]){
            CameraView *view = (CameraView*)nib;
            view.delegate = self;
            imagePicker.cameraOverlayView = view;
        }
    }

    [self presentViewController:imagePicker
                       animated:NO completion:nil];
}

我还没有尝试过你的方式,但我也想创建一个自定义的相机视图。这可能不是您想要的,但它是一个替代方案。我与.xib文件一起创建了一个自定义UIView

在.m文件中,您只需将适当的委托方法调用到您实例化imagePicker的ViewController。在此ViewController中,然后调用适当的方法,如
takePicture

通过这种方式,您可以使用xib文件使覆盖看起来像任何您喜欢的方式。您可以实例化图像选择器

    FALKCameraView.h :

        @protocol CameraViewDelegate <NSObject>

        - (void)cameraPressed;

        - (void)buttonPressed;
        //etc


        @end

        @interface FALKCameraView : UIView

        @property (nonatomic, assign) NSObject<CameraViewDelegate> *delegate;

        //Camera Button pressed- notifies CameraViewDelegate
        - (IBAction)cameraPressed:(id)sender;
        //Button pressed - notifies CameraViewDelegate
        -(IBAction)buttonPressed:(id)sender;


        @end

    FALKCameraView.m:

    @implementation FALKCameraView

    @synthesize delegate;

    - (IBAction)cameraPressed:(id)sender{
        [delegate cameraPressed];
    }

    -(IBAction)buttonnPressed:(id)sender{
        [delegate buttonPressed];
    }


    @end


    FALKCameraViewController.h:

    @interface FALKCameraViewController : UIViewController <UIImagePickerControllerDelegate, CameraViewDelegate>

    - (void)cameraPressed;

    - (void)buttonPressed;

    @end


    FALKCameraViewController.m:

    @interface FALKCameraViewController
         @property (strong,nonatomic) UIImagePickerController *imagePicker;
    @end

    @implementation FALKCameraViewController
    @synthesise imagePicker;

    -(void)setUpCamera{
        if ([UIImagePickerController isSourceTypeAvailable:
                 UIImagePickerControllerSourceTypeCamera]){
                imagePicker = [[UIImagePickerController alloc] init];
                imagePicker.delegate = self;
                imagePicker.sourceType =
                UIImagePickerControllerSourceTypeCamera;
                imagePicker.showsCameraControls = NO;
                imagePicker.allowsEditing = NO;


imagePicker.mediaTypes = @[(NSString *) kUTTypeImage];



                NSString *nibName = @"FALKCameraView";

                NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:nibName
                                                              owner:nil
                                                            options:nil];
                if([nibs count]){
                    id nib = [nibs objectAtIndex:0];
                    if([nib isKindOfClass:[FALKCameraView class]]){
                        FALKCameraView *view = (FALKCameraView*)nib;
                        view.delegate = self;
                        imagePicker.cameraOverlayView = view;
                    }
                }

                [self presentViewController:imagePicker
                                   animated:NO completion:nil];
            }
    }



        -(void)cameraPressed:(id)sender{
               [imagePicker takePicture];
        }

    @end
FALKCameraView.h:
@协议摄像机网关
-(无效)摄像加压;
-(无效)按下按钮;
//等
@结束
@接口FALKCameraView:UIView
@属性(非原子,赋值)NSObject*委托;
//按下摄像头按钮-通知CameraViewDelegate
-(iAction)摄像机显示:(id)发送方;
//按下按钮-通知CameraViewDelegate
-(iAction)按钮按下:(id)发送者;
@结束
FALKCameraView.m:
@实施FALKCameraView
@综合代表;
-(iAction)摄像机显示:(id)发送方{
[拍摄代表照片];
}
-(iAction)按钮按下:(id)发送者{
[按下代表按钮];
}
@结束
FALKCameraViewController.h:
@接口FALKCameraViewController:UIViewController
-(无效)摄像加压;
-(无效)按下按钮;
@结束
falkcameravewcontroller.m:
@接口FALKCameraViewController
@属性(强,非原子)UIImagePickerController*imagePicker;
@结束
@falkcameravewcontroller的实现
@综合图像采集器;
-(无效)设置摄影机{
如果([UIImagePickerController]资源类型可用:
UIImagePickerControllerSourceTypeCamera]){
imagePicker=[[UIImagePickerController alloc]init];
imagePicker.delegate=self;
imagePicker.sourceType=
UIImagePickerControllerSourceTypeCamera;
imagePicker.showsCameraControls=否;
imagePicker.allowsEditing=否;
imagePicker.mediaTypes=@[(NSString*)kUTTypeImage];
NSString*nibName=@“FALKCameraView”;
NSArray*nibs=[[NSBundle mainBundle]loadNibNamed:nibName
业主:无
选项:无];
如果([笔尖计数]){
id nib=[nibs objectAtIndex:0];
if([nib是类的种类:[FALKCameraView类]]){
FALKCameraView*视图=(FALKCameraView*)nib;
view.delegate=self;
imagePicker.cameraOverlayView=视图;
}
}
[自呈现视图控制器:图像选择器]
动画:无完成:无];
}
}
-(无效)摄像机显示:(id)发送方{
[图像采集器拍摄];
}
@结束

您的自定义按钮是否识别触摸,您是否为这些按钮创建了操作?@Bonnie Yes。我已经为所有按钮创建了动作,它们可以识别触摸。但是,当我实现覆盖时,它们不会!谢谢你的帮助,但我正在使用故事板。。。这有区别吗?尽管我尝试实现它,但在行中出现了一个错误:imagePicker.cameraView=view;在我的代码中,我需要用什么替换cameraView?喜欢viewcontroller的名称吗?非常感谢你的帮助!我在项目的其余部分也使用故事板,您仍然可以从自定义的.xib文件加载。你犯了什么样的错误?您是否使用自己的.xib文件等创建了独立的UIView子类?“CameraView”是我创建的自定义UIView的名称。所以您应该有:CameraView.h、CameraView.m和CameraView.xib。现在只需将xib中的UI保留为空,并确保将xib中的视图类设置为CameraView。哦,好吧,有两件事:您需要在视图控制器中实现协议“CameraViewDelegate”-这是我在上面的“.h”文件代码中为您提供的协议。现在是第二个错误-属性的名称没有更改。如果将自定义“UIView”调用为“FALKCameraView”,则代码应为:“imagePicker.cameraView=view;”正如上面所说的那样。”“cameraView”是“imagePicker”的内置属性,您不能更改它。而“view”是上面代码中的一个变量,它被实例化为“(CameraView*)nib”,因此,如果您将自定义UIView称为“FalkCameraView”,那么您会将其实例化为该变量。只需将上述代码中的“CameraView”替换为“FalkCameraView”。)谢谢你的帮助!我还试图实现这一点。我并不真的想要一个有覆盖层的,但我正在尝试。它在
Utils
上出现了一个错误。我试着搜索它,但我仍然不知道它是什么或它做什么。。。我必须在我的代码中替换它吗?或者你知道它出错的原因吗?干杯:)