2012-09-05 127 views
1

我有一个UIViewController,我想在加载视图时打开相机的UIImagePickerController。当视图加载时打开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)而不是全屏,这样我就可以离开我的顶部导航栏。

我怎样才能达到上述目的?

+0

不能与图像拾取做到这一点,你必须用相机作为输入设备创建捕获会话,并在自定义视图中显示它。HTTP ://www.musicalgeometry.com/?p = 1273 –

+0

我不能做A或B? – Dejell

+0

两种都有。对于“A”我建议你在viewDidAppear void wait_fence错误,并且使用图像选择器无法完成“B”。 –

回答

1

对于情况A,更好地把这个viewDidAppear,而不是viewWillAppear避免动画碰撞(和wait_fences错误)

在B的情况,您可能需要捕获会话,或者需要使用转换到tweek的UIImagePickerController。你可以做到这一点得益于后续UIImagePickerController属性:

  • cameraViewTransform更改应用于显示了相机/摄像视图的CGAffineTransform。因此,你将能够将其缩小例如
  • showsCameraControls,你可以设置为NO隐藏默认iOS的控制,如果你打算添加自己的UIButtons代替
  • cameraOverlayView,可以让你把一个任意UIView顶上相机视图。您通常使用的视图有一个backgroundColor = [UIColor clearColor]并添加一些子视图,尤其是一些装饰UIImageView(如果需要)(例如一帧),一些UIButton s触发相机(并使用UIImagePickerControllerUIImagePickerController的方法UIImagePickerController相应IBAction如需要),并取代你与以前的财产藏集结其摄像头的控制,等等

在你的情况,如果你想保持普通相机的按钮,但只是想改变框架和使其不是全屏,那么cameraTransform属性通常就是你需要的。添加装饰框周围将简单地包括使用UIImageViewcameraOverlayView财产,并用它来显示装饰框的图像(图像与它的中心透明的,使得相机视图是当然的直通它可见,)


[编辑]请注意(根据文档)cameraTransform属性只有在拍摄动画时才可用(当时sourceType == UIImagePickerControllerSourceTypeCamera)。因此,您可以使用它来让用户从其相机拍摄照片,但如果您想使用UIImagePickerController从图库中选择一张照片,则不能使用cameraTransform(这很合理,因为它看起来很奇怪在屏幕上显示)。所以一定要在这种情况下才使用它,特别是在设备上没有UIImagePickerControllerSourceTypeCamera信号源类型时避免它。

+0

viewWillApepar不断加载它不停 - 用户拍摄照片或选择一个从库后,它再次加载它 – Dejell

+0

当然,你必须使用一些条件。通常情况下,一旦用户捕获了图像,你可能会把它保存在你的'UIViewController'的'@property UIImage * chosenImage'中,所以你可以使用if(self.chosenImage == nil)'作为条件来显示'viewDidAppear'中的'UIImagePickerController';) – AliSoftware

+0

谢谢。关于cameraOverlayView - 你有一个代码示例如何做到这一点? – Dejell

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

+0

您的解决方案适用于A。但B怎么办? – Dejell

+0

所以我不确定pickercontrol可以做你要求的B.请参阅上面的更新。 –

1

只实现你的行动统一到viewDidLoad方法。这是我做的,现在可完全正常。

相关问题