我有一个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)而不是全屏,所以我可以离开我的顶部导航栏。
我如何实现上述目标?
答案 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}},stopVideoCapture
和UIImagePickerController
方法,并替换您使用之前隐藏的构建相机控件财产,等等在您的情况下,如果您想保留常规相机的按钮,但只是想更改框架并使其不是全屏,那么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];
}
}
}
我建议使用“cameraOverlayView”来尝试创建某种伪导航栏,其中交互将按预期工作。
“您可以自定义图像选择控制器以自行管理用户交互。为此,请提供包含要显示的控件的叠加视图,并使用”捕获静止图像或电影“中描述的方法。您可以显示除了默认控件之外,还可以代替默认控件。自定义叠加视图UIImagePickerController类的自定义叠加视图在iOS 3.1及更高版本中通过cameraOverlayView属性提供。有关代码示例,请参阅PhotoPicker示例代码项目。 / p>
重要UIImagePickerController类仅支持纵向模式。此类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改,但有一个例外。您可以将自定义视图分配给cameraOverlayView属性,并使用该视图显示其他信息或管理相机界面与代码之间的交互。“