出现视图时立即打开相机

时间:2017-07-07 06:38:09

标签: ios objective-c camera

我的应用程序中有一项要求,我需要立即打开相机。 但是,当我来到ViewController时,开启相机需要几秒钟的时间。谁能帮我。 我尝试过使用队列块,但这不起作用。 这是我到目前为止尝试的代码:==

    - (void)viewDidLoad {

            [super viewDidLoad];
            [[NSOperationQueue mainQueue] addOperationWithBlock:^ {
                [self onClickCamera:nil];

                //Your code goes in here
                NSLog(@"Main Thread Code");

            }];
//    dispatch_async(dispatch_get_main_queue(), ^{
//        [self onClickCamera:nil];
//    });

//    dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
//    dispatch_async(queue, ^{
//        [self onClickCamera:nil];
//
//        // Do some computation here.
//        
//        // Update UI after computation.
//        dispatch_async(dispatch_get_main_queue(), ^{
//            // Update the UI on the main thread.
//        });
//    });


    }

        - (IBAction)onClickCamera:(id)sender
        {
            NSLog(@"CALeed");
            UIImagePickerController *picker = [[UIImagePickerController alloc] init];
            picker.delegate = self;
            picker.allowsEditing = NO;
            picker.sourceType = UIImagePickerControllerSourceTypeCamera;
            [self presentViewController:picker animated:YES completion:NULL];
        }

2 个答案:

答案 0 :(得分:1)

两个问题:

问题1:

在viewDidLoad视图中尚未完成呈现其布局。因此,尝试在仍在渲染的视图上呈现某些内容,显然会增加延迟。只有在视图完成布局后,才会触发呈现相机。

因此,请将代码从viewDidLoad移至viewDidAppear

 - (void) viewDidAppear {
     [super viewDidAppear];
     [self onClickCamera:nil];
 }

问题2:

更多警告然后错误。

为什么连[NSOperationQueue mainQueue] addOperationWithBlock:? ViewDidLoad总是在主线程上被调用,它与序列化的主队列本身相关联。不必要的上下文切换没有多大意义

答案 1 :(得分:0)

我同意@ SandeepBhandari的回答。除了调用viewDidAppear()中显示相机的方法以减少延迟之外,您可以更改以下行:

更改

[self presentViewController:picker animated:YES completion:NULL];

[self presentViewController:picker animated:NO completion:NULL];

为此添加更多信息,您可以全局预定义您的pickerController,并在viewDidLoad()

中设置它的所有属性和参数
- (void)viewDidLoad{

    picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = NO;
    picker.sourceType = UIImagePickerControllerSourceTypeCamera;

}

最初,您可以将viewController主视图的 backgroundColour 设置为黑色或类似于launchScreen的颜色,以避免在出现相机时看到毛刺。

您还可以使用 CATransition 来缩短时间,如下所示

CATransition *transition = [CATransition animation];
    [transition setDuration:0];
    [transition setType:kCATransitionFromBottom];
    [transition setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
    [picker.view.layer addAnimation:transition forKey:kCATransitionFromBottom];

然后呈现选择器控制器。

嗯,这还不能保证能给你带来渴望的结果,因为呈现一些东西显然需要一些时间。如果您在应用中使用了相机,那么我建议为其使用自定义类,并使用 AVCaptureVideoPreviewLayer 来显示相机。