ECMAScript 6 имеет «генераторы», которые позволяют вам легко программировать в асинхронном стиле.
function* myGenerator() {
const callback = yield;
let [response] = yield $.ajax("https://stackoverflow.com", {complete: callback});
console.log("response is:", response);
// examples of other things you can do
yield setTimeout(callback, 1000);
console.log("it delayed for 1000ms");
while (response.statusText === "error") {
[response] = yield* anotherGenerator();
}
}
Для запуска вышеуказанного кода вы делаете это:
const gen = myGenerator(); // Create generator
gen.next(); // Start it
gen.next((...args) => gen.next([...args])); // Set its callback function
Если вам нужно настроить таргетинг на браузеры, которые не поддерживают ES6, вы можете запустить код через Babel или short-compiler для генерации ECMAScript 5.
Обратный вызов ...args
завернут в массив и разрушен, когда вы их читаете так что шаблон может справиться с обратными вызовами, которые имеют несколько аргументов. Например, с узлом fs :
const [err, data] = yield fs.readFile(filePath, "utf-8", callback);
Это очень просто, просто используйте справочник по AVFoundation:
Если вы не хотите, чтобы пользователь просматривал вход предварительного просмотра, вы можете просто пропустить часть кода предварительного просмотра.
Изменить: Кому более подробно.
1) Вы настроили конфигурацию захвата с помощью AVFoundation.
2) Вы пропустите часть, на которой установлен уровень предварительного просмотра видео.
3) Вы вызываете метод captureStillImageAsynchronouslyFromConnection: completeHandler: всякий раз, когда вы хотите, чтобы изображение было снято.
Примечание. Если вы хотите, чтобы вспышка не была услышана, и поэтому вы можете нарушать права пользователя в некоторых странах (например, в Японии). Один обходной путь, который я знаю для этого, - это захват кадра видео (не запускает вспышку).
В файле .h
@interface ABCViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
- (IBAction)takePhoto: (UIButton *)sender;
- (IBAction)selectPhoto:(UIButton *)sender;
@end
В файле .m file
@interface ABCViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
- (IBAction)takePhoto:(UIButton *)sender {
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Device has no camera"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles: nil];
[myAlertView show];
} else {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:picker animated:YES completion:NULL];
}
}
- (IBAction)selectPhoto:(UIButton *)sender {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:picker animated:YES completion:NULL];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
self.imageView.image = chosenImage;
[picker dismissViewControllerAnimated:YES completion:NULL];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[picker dismissViewControllerAnimated:YES completion:NULL];
}
Вы также можете сделать это без AVFoundation, и это, на мой взгляд, более простой способ реализовать его, используя только UIImagePickerController. Существует 3 условия:
Ниже приведен простой пример того, что вы обычно запускаете после нажатия кнопки
- (IBAction)takePhoto:(id)sender
{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.cameraDevice = UIImagePickerControllerCameraDeviceFront;
picker.showsCameraControls = NO;
[self presentViewController:picker animated:YES
completion:^ {
[picker takePicture];
}];
}
VLBCameraView - это библиотека, использующая AVFoundation для съемки.
В представлении отображается предварительный просмотр, который затем можно вызвать методом VLBCameraView # takePicture, чтобы сделать снимок.
Поставляется с CocoaPods.
Вот код для пользовательской камеры Objective-C. Вы можете добавлять функции, кнопки в соответствии с вашим желанием.
blockquote>#import "CustomCameraVC.h" @interface CustomCameraVC () { BOOL frontCamera; } @property (strong,nonatomic) AVCaptureSession *captureSession; @property (strong,nonatomic) AVCaptureStillImageOutput *stillImageOutput; @property (strong,nonatomic) AVCaptureVideoPreviewLayer *videoPreviewLayer; @property (weak, nonatomic) IBOutlet UIView *viewCamera; @end @implementation CustomCameraVC - (void)viewDidLoad { [super viewDidLoad]; } -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:YES]; frontCamera = NO; [self showCameraWithFrontCamera:frontCamera]; } -(void)showCameraWithFrontCamera:(BOOL)flag { self.captureSession = [[AVCaptureSession alloc]init]; self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto; AVCaptureDevice *captureDevice; if(flag) { captureDevice= [self frontCamera]; } else { captureDevice= [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; } NSError *error = nil; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; [self.captureSession addInput:input]; self.stillImageOutput = [AVCaptureStillImageOutput new]; self.stillImageOutput.outputSettings = @{AVVideoCodecKey:AVVideoCodecJPEG}; [self.captureSession addOutput:_stillImageOutput]; self.videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession]; self.videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; self.videoPreviewLayer.connection.videoOrientation = AVCaptureVideoOrientationPortrait; [self.viewCamera.layer addSublayer:self.videoPreviewLayer]; [self.captureSession startRunning]; self.videoPreviewLayer.frame = self.viewCamera.bounds; } - (AVCaptureDevice *)frontCamera { NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; for (AVCaptureDevice *device in devices) { if ([device position] == AVCaptureDevicePositionFront) { return device; } } return nil; } - (IBAction)btnCaptureImagePressed:(id)sender { AVCaptureConnection * videoConnection = [_stillImageOutput connectionWithMediaType:AVMediaTypeVideo]; [_stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef _Nullable sampleBuffer, NSError * _Nullable error) { NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:sampleBuffer]; UIImage *image = [[UIImage alloc]initWithData: imageData]; UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); }]; } @end