在视图加载时打开UIImagePickerController

时间:2012-09-05 16:33:38

标签: iphone objective-c uiimagepickercontroller uistoryboard

我有一个UIViewController,我想加载视图 - 打开相机的UIImagePickerController。

一个。我写了以下内容: 已编辑 - 我现在正在使用viewDidAppear

- (void)viewDidAppear:(BOOL)animated{
    imagePicker = [[UIImagePickerController alloc] init];
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
        [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
    }
    else{
        [imagePicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    }
    [imagePicker setDelegate:self];
    [self presentModalViewController:imagePicker animated:YES];
}

问题是,在用户拍摄快照或从文件夹中选择图像后 - 它会继续再次加载UIImagePicker - 我怎样才能让它只调用一次?

B中。我希望相机显示在一个矩形内(可能是UIImage或UIView)而不是全屏,所以我可以离开我的顶部导航栏。

我如何实现上述目标?

3 个答案:

答案 0 :(得分:1)

对于案例A,最好将其放在viewDidAppear而不是viewWillAppear中,以避免动画冲突(以及wait_fences错误)

对于案例B,您需要一个捕获会话,或者需要使用转换来调整UIImagePickerController。您可以执行此操作,这要归功于以下UIImagePickerController属性:

  • cameraViewTransform更改应用于显示相机/视频的视图的CGAffineTransform。因此,您可以缩小它,例如
  • showsCameraControls如果您打算添加自己的NO,则可以设置为UIButtons以隐藏默认的iOS控件
  • cameraOverlayView允许您在摄像机视图上放置任意UIView。您通常使用具有backgroundColor = [UIColor clearColor]的视图并为其添加一些子视图,尤其是一些装饰UIImageView(如果需要)(例如一个帧),一些UIButton来触发相机(和根据需要在相应的takePicture中使用startVideoCapture的{​​{1}},stopVideoCaptureUIImagePickerController方法,并替换您使用之前隐藏的构建相机控件财产,等等

在您的情况下,如果您想保留常规相机的按钮,但只是想更改框架并使其不是全屏,那么IBAction属性通常就是您所需要的。添加装饰框架只需使用cameraTransform UIImageView属性,并使用它来显示装饰框的图像(图像中心透明,以便通过它可以看到相机视图,当然)


[编辑]请注意(根据文档)cameraOverlayView属性仅在捕捉电影时可用(cameraTransform时)。因此,您可以使用它来让用户从相机中拍照,但如果您想使用sourceType == UIImagePickerControllerSourceTypeCamera从库中选择图片,则无法使用UIImagePickerController(以及非常符合逻辑,因为在屏幕上显示会很奇怪)。所以请务必仅在这种情况下使用它,尤其是当设备上没有cameraTransform源类型时,请避免使用它。

答案 1 :(得分:1)

只需将您的操作实施到viewDidLoad方法即可。这就是我所做的,它现在完美无缺。

答案 2 :(得分:0)

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self getMediaFromSource:UIImagePickerControllerSourceTypeCamera];

}
- (IBAction)TakePhoto:(id)sender {
    [self getMediaFromSource:UIImagePickerControllerSourceTypeCamera];
}

- (void)getMediaFromSource:(UIImagePickerControllerSourceType)sourceType{
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    picker.delegate         = self; 
    picker.allowsEditing        = NO; 
    picker.sourceType           = sourceType; 
    [self presentModalViewController:picker animated:YES];

    [picker release];
}

#pragma mark - UIImagePickerController delegate methods
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    [picker dismissModalViewControllerAnimated:YES];
    [self.tabBarController setSelectedIndex:1];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 

    [picker dismissModalViewControllerAnimated:YES];
    [self.tabBarController setSelectedIndex:1];
}

更新了B部分。 cameraOverlayView的示例代码

- (void)setupImagePicker:(UIImagePickerControllerSourceType)sourceType
 {
    self.imagePickerController.sourceType = sourceType;

if (sourceType == UIImagePickerControllerSourceTypeCamera)
{
    // user wants to use the camera interface
    //
    self.imagePickerController.showsCameraControls = NO;

    if ([[self.imagePickerController.cameraOverlayView subviews] count] == 0)
    {
        // setup our custom overlay view for the camera
        //
        // ensure that our custom view's frame fits within the parent frame
        CGRect overlayViewFrame = self.imagePickerController.cameraOverlayView.frame;
        CGRect newFrame = CGRectMake(0.0,
                                     CGRectGetHeight(overlayViewFrame) -
                                     self.view.frame.size.height - 10.0,
                                     CGRectGetWidth(overlayViewFrame),
                                     self.view.frame.size.height + 10.0);
        self.view.frame = newFrame;
        [self.imagePickerController.cameraOverlayView addSubview:self.view];
    }
 }
}

http://developer.apple.com/library/ios/#samplecode/PhotoPicker/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010196

我建议使用“cameraOverlayView”来尝试创建某种伪导航栏,其中交互将按预期工作。

“您可以自定义图像选择控制器以自行管理用户交互。为此,请提供包含要显示的控件的叠加视图,并使用”捕获静止图像或电影“中描述的方法。您可以显示除了默认控件之外,还可以代替默认控件。自定义叠加视图UIImagePickerController类的自定义叠加视图在iOS 3.1及更高版本中通过cameraOverlayView属性提供。有关代码示例,请参阅PhotoPicker示例代码项目。 / p>

重要UIImagePickerController类仅支持纵向模式。此类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改,但有一个例外。您可以将自定义视图分配给cameraOverlayView属性,并使用该视图显示其他信息或管理相机界面与代码之间的交互。“

http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIImagePickerController_Class/UIImagePickerController/UIImagePickerController.html