1

我有一个 UIViewController,我想在加载视图时为相机打开一个 UIImagePickerController。

A. 我写了以下内容: EDITED - 我现在正在使用 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)而不是全屏,这样我就可以离开顶部导航栏。

我怎样才能实现上述目标?

4

3 回答 3

1

只需将您的操作实施到 viewDidLoad 方法中。这就是我所做的,现在它工作得很好。

于 2013-06-27T16:16:34.973 回答
1

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

对于案例 B,您要么需要捕获会话,要么需要UIImagePickerController使用转换来调整。由于以下UIImagePickerController属性,您可以做到这一点:

  • cameraViewTransform更改CGAffineTransform应用于显示相机/视频的视图。因此,您将能够缩小它,例如
  • showsCameraControlsNO如果您打算添加自己的控件,则可以设置为隐藏默认的UIButtonsiOS控件
  • cameraOverlayView这允许您在相机视图的任意UIView顶部放置。您通常使用具有 a 的backgroundColor = [UIColor clearColor]视图并向其添加一些子视图,尤其是UIImageView在需要时添加一些装饰性(例如框架),一些UIButtons 来触发相机(并根据需要使用它们对应的takePicture,startVideoCapturestopVideoCapture方法)并替换build-it 相机控件您使用以前的属性隐藏,依此类推UIImagePickerControllerIBAction

在您的情况下,如果您想保留常规相机的按钮,但只想更改框架并使其不是全屏,cameraTransform那么该属性通常就是您需要的。在周围添加装饰框架将简单地包括使用UIImageViewforcameraOverlayView属性并使用它来显示装饰框架的图像(图像的中心是透明的,因此相机视图通过它可见,当然)


[编辑] 请注意(根据文档)该cameraTransform属性仅在捕获电影时可用(当sourceType == UIImagePickerControllerSourceTypeCamera)。所以你可以用它让用户从它的相机里拍照,但是如果你想用你UIImagePickerController的从库中选择一张图片,你就不能使用cameraTransform(这很合乎逻辑,因为它看起来很奇怪在屏幕上)。因此,请务必仅在这种情况下使用它,尤其UIImagePickerControllerSourceTypeCamera是在设备上没有源类型时避免使用它。

于 2012-09-05T17:12:55.820 回答
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 示例代码项目。

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

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

于 2012-09-05T18:42:51.450 回答