我的应用程序中有一项要求,我需要立即打开相机。 但是,当我来到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];
}
答案 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 来显示相机。