iPhone摄像头,如何避免camera preverw preivew view; 如何知道什么时候进入预览视图?

在相机工作stream程中,拍摄照片,然后在下一个屏幕上,我们将其称为“ select屏幕” ,您可以select是要使用此照片还是重新拍摄照片。

我怎么知道,当相机进入预览视图

我的问题是,我已经添加了一个button来访问相机胶卷,这工作正常。 障碍在于,当拍照并进入预览视图 (2.相机视图)时,该button隐藏“使用照片”选项。 所以我不能select它。 我想在进入预览视图时隐藏button,或者只是避免预览视图

在这里输入图像说明

在我的代码下面

CamViewScreen.h

#import <UIKit/UIKit.h> #import "CameraViewController.h" #import <AssetsLibrary/AssetsLibrary.h> @interface CamViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> @property (nonatomic, strong) UIImage *image; @property (nonatomic, strong) UIImage *lastTakenImage; - (IBAction)takePhoto:(id)sender; - (IBAction)selectPhoto:(id)sender; @end 

CamViewScreen.m

 #import "CamViewController.h" @interface CamViewController () @end @implementation CamViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } int isAction = 0; // Photo, 1: CameraRoll, 2: Cancel - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Device has no camera" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; [myAlertView show]; } isAction = 0; [self cameraRoll]; } -(void)viewDidAppear:(BOOL)animated { // isAction = 0 Photo, 1: CameraRoll, 2: Cancel DLog(@"###### isAction> %d", isAction); switch (isAction) { case 1: [self selectPhoto:nil]; break; case 2: [self dismissViewControllerAnimated:NO completion:nil]; break; default: [self takePhoto:nil]; break; } } - (IBAction)takePhoto:(id)sender { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.allowsEditing = NO; picker.sourceType = UIImagePickerControllerSourceTypeCamera; picker.cameraOverlayView = [self addCameraRollButton]; // suggestion from omz // [self addCameraRollButton:picker.view]; [self presentViewController:picker animated:YES completion:NULL]; } -(void)prepareCameraRoll { isAction = 1; [self dismissViewControllerAnimated:NO completion:nil]; } - (IBAction)selectPhoto:(id)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.image = chosenImage; isAction = 0; [picker dismissViewControllerAnimated:YES completion:NULL]; [self performSegueWithIdentifier:@"toCameraView" sender:info]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { isAction = 2; // Cancel [picker dismissViewControllerAnimated:YES completion:NULL]; } # pragma mark - for the cameraOverlayView // suggestion from omz - (UIView *)addCameraRollButton { float startY = ([[UIScreen mainScreen] bounds].size.height == 568.0) ? 500.0 : 410.0; UIButton *rollButton = [UIButton buttonWithType:UIButtonTypeCustom]; rollButton.frame = CGRectMake(230.0, startY, 60.0, 60.0); rollButton.backgroundColor = [UIColor clearColor]; [rollButton setImage:self.lastTakenImage forState:UIControlStateNormal]; rollButton.imageView.contentMode = UIViewContentModeScaleAspectFill; [rollButton addTarget:self action:@selector(prepareCameraRoll) forControlEvents:UIControlEventTouchUpInside]; return rollButton; } # pragma mark - CameraRoll function and presentation - (void)addCameraRollButton:(UIView *)picker { float startY = ([[UIScreen mainScreen] bounds].size.height == 568.0) ? 500.0 : 410.0; UIButton *rollButton = [UIButton buttonWithType:UIButtonTypeCustom]; rollButton.frame = CGRectMake(230.0, startY, 60.0, 60.0); rollButton.backgroundColor = [UIColor clearColor]; [rollButton setImage:self.lastTakenImage forState:UIControlStateNormal]; rollButton.imageView.contentMode = UIViewContentModeScaleAspectFill; [rollButton addTarget:self action:@selector(prepareCameraRoll) forControlEvents:UIControlEventTouchUpInside]; [picker addSubview:rollButton]; } -(void)cameraRoll { ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { if (nil != group) { // be sure to filter the group so you only get photos [group setAssetsFilter:[ALAssetsFilter allPhotos]]; [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) { if (asset) { ALAssetRepresentation *repr = [asset defaultRepresentation]; // UIImage *img = [UIImage imageWithCGImage:[repr fullResolutionImage]]; UIImage *img = [UIImage imageWithCGImage:[repr fullScreenImage]]; [self setLastTakenImage:img]; *stop = YES; } }]; } *stop = NO; } failureBlock:^(NSError *error) { NSLog(@"error: %@", error); }]; } #pragma mark - Navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { CameraViewController *cvc = [segue destinationViewController]; cvc.image = self.image; DLog(@"%@, cvcimage", cvc.image); } @end 

find了解决办法。 很难find,但终于明白了。 解决scheme在UIImagePicker中描述cameraOverlayView出现在“重拍”屏幕上 。 此外,我添加我的工作代码为其他谁有同样的问题。

使用NSNotificationCenter@“_ UIImagePickerControllerUserDidCaptureItem”@“_UIImagePickerControllerUserDidRejectItem”是关键!

CamViewController.h

 #import <UIKit/UIKit.h> #import "CameraViewController.h" #import <AssetsLibrary/AssetsLibrary.h> @interface CamViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> @property (nonatomic, strong) UIImage *image; @property (nonatomic, strong) UIImage *lastTakenImage; @property (nonatomic, strong) UIImagePickerController *picker; - (IBAction)takePhoto:(id)sender; - (IBAction)selectPhoto:(id)sender; @end 

CamViewController.h

 #import "CamViewController.h" @interface CamViewController () @end @implementation CamViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } int isAction = 0; // Photo, 1: CameraRoll, 2: Cancel - (void)viewDidLoad { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"_UIImagePickerControllerUserDidCaptureItem" object:nil ]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"_UIImagePickerControllerUserDidRejectItem" object:nil ]; [super viewDidLoad]; if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Device has no camera" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; [myAlertView show]; } isAction = 0; [self cameraRoll]; } -(void)handleNotification:(NSNotification *)message { if ([[message name] isEqualToString:@"_UIImagePickerControllerUserDidCaptureItem"]) { // Remove overlay, so that it is not available on the preview view; self.picker.cameraOverlayView = nil; } if ([[message name] isEqualToString:@"_UIImagePickerControllerUserDidRejectItem"]) { // Retake button pressed on preview. Add overlay, so that is available on the camera again self.picker.cameraOverlayView = [self addCameraRollButton]; } } -(void)viewDidAppear:(BOOL)animated { // isAction = 0: Photo, 1: CameraRoll, 2: Cancel DLog(@"###### isAction> %d", isAction); switch (isAction) { case 1: [self selectPhoto:nil]; break; case 2: [self dismissViewControllerAnimated:NO completion:nil]; break; default: [self takePhoto:nil]; break; } } - (IBAction)takePhoto:(id)sender { self.picker = [[UIImagePickerController alloc] init]; self.picker.delegate = self; self.picker.allowsEditing = YES; // if this is NO or missing, the image the image will not be in info[UIImagePickerControllerEditedImage] self.picker.sourceType = UIImagePickerControllerSourceTypeCamera; self.picker.cameraOverlayView = [self addCameraRollButton]; [self presentViewController:self.picker animated:YES completion:NULL]; } -(void)prepareCameraRoll { isAction = 1; [self dismissViewControllerAnimated:NO completion:nil]; } - (IBAction)selectPhoto:(id)sender { self.picker = [[UIImagePickerController alloc] init]; self.picker.delegate = self; self.picker.allowsEditing = YES; self.picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [self presentViewController:self.picker animated:YES completion:NULL]; } - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { self.image = info[UIImagePickerControllerEditedImage]; isAction = 0; [picker dismissViewControllerAnimated:YES completion:NULL]; [self performSegueWithIdentifier:@"toCameraView" sender:info]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { isAction = 2; // Cancel [picker dismissViewControllerAnimated:YES completion:NULL]; } # pragma mark - CameraRoll function and presentation - (UIView *)addCameraRollButton { float startY = ([[UIScreen mainScreen] bounds].size.height == 568.0) ? 500.0 : 410.0; UIButton *rollButton = [UIButton buttonWithType:UIButtonTypeCustom]; rollButton.frame = CGRectMake(230.0, startY, 60.0, 60.0); rollButton.backgroundColor = [UIColor clearColor]; [rollButton setImage:self.lastTakenImage forState:UIControlStateNormal]; rollButton.imageView.contentMode = UIViewContentModeScaleAspectFill; [rollButton addTarget:self action:@selector(prepareCameraRoll) forControlEvents:UIControlEventTouchUpInside]; return rollButton; } -(void)cameraRoll { // have to import assetlibrary framework!!! ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { if (nil != group) { // be sure to filter the group so you only get photos [group setAssetsFilter:[ALAssetsFilter allPhotos]]; [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) { if (asset) { ALAssetRepresentation *repr = [asset defaultRepresentation]; // UIImage *img = [UIImage imageWithCGImage:[repr fullResolutionImage]]; UIImage *img = [UIImage imageWithCGImage:[repr fullScreenImage]]; [self setLastTakenImage:img]; *stop = YES; } }]; } *stop = NO; } failureBlock:^(NSError *error) { NSLog(@"error: %@", error); }]; } #pragma mark - Navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { CameraViewController *cvc = [segue destinationViewController]; cvc.image = self.image; DLog(@"%@, cvcimage", cvc.image); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end 

@ jerik – 我看到你修改了你的问题。 您可以将UIImagePickerController属性showsCameraControls设置为no,这将消除预览屏幕 – 这也隐藏了默认控件(并且可以让您拍摄多张照片而不closures相机),但由于您使用的是cameraOverlayView ,因此无关紧要。 这只适用于媒体types是摄像头,你将不得不实现UIImagePickerDelegate协议的takePicture函数以编程方式拍照。

我还没有尝试改变预览屏幕的控制黑客。 如果你真的想保持预览屏幕,你需要添加逻辑到你自己的takePhoto函数,确定是否应该调用picker.cameraOverlayView = [self addCameraRollButton] (拍照)或不(预览屏幕),但我' m不知道是否可以dynamic更改cameraOverlayView的预览屏幕 – 这似乎是苹果不希望你搞乱。 无论如何,祝你好运!

只要在这里发布未来的Swift引用,如果有人需要它。

我一直有同样的问题,经过一天的研究,有很多线索和错误,我find了一种方法,从图像预览中删除cameraOverlayView。

当你拍照时触发“_UIImagePickerControllerUserDidCaptureItem”。 幸运的是,我们可以通过创build闭包的观察者来利用这个。 在闭包内部,我们可以将cameraOverlayView设置为零,从而在进入预览之前删除您的自定义视图。

这可以在Xcode版本8.1(8B62)中使用Swift 3。

我已经添加了代码片段供您使用,如果需要的话。

 NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "_UIImagePickerControllerUserDidCaptureItem"), object:nil, queue:nil, using: { note in self.imagePicker.cameraOverlayView = nil )} 

在迅速4为未来的参考。 我正在使用isHidden,因为当用户select“重拍”时,我有问题要显示。

 NotificationCenter.default.addObserver(forName: Notification.Name("_UIImagePickerControllerUserDidCaptureItem"), object: nil, queue: nil) { _ in overlayView.isHidden = true overlayView.isUserInteractionEnabled = false } NotificationCenter.default.addObserver(forName: Notification.Name("_UIImagePickerControllerUserDidRejectItem"), object: nil, queue: nil) { _ in overlayView.isHidden = false overlayView.isUserInteractionEnabled = true }