打开时的UIImagePickerController鉴于负荷(Open UIImagePicker

2019-09-22 04:16发布

我有一个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的),而不是全屏,所以我就可以离开我的顶部导航栏。

我怎样才能实现以上?

Answer 1:

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

在B的情况,您可能需要捕获会话,或者需要tweek的UIImagePickerController使用变换。 你可以做,由于后续UIImagePickerController属性:

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

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


[编辑]需要注意的是(根据文档)的cameraTransform属性只可拍摄电影时(当sourceType == UIImagePickerControllerSourceTypeCamera )。 所以,你可以用它来让用户从相机拍摄一张照片,但如果你想用你UIImagePickerController选择从库中的图片,你不能使用cameraTransform (这很符合逻辑,因为这看起来很奇怪以显示在屏幕上)。 所以,要确保只有在这种情况下使用它,特别是避免当UIImagePickerControllerSourceTypeCamera源类型不可用在设备上。



Answer 2:

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



Answer 3:

- (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];
}

cameraOverlayView的更新部分B.实施例的代码

- (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



文章来源: Open UIImagePickerController when view loads