ios简单实现隐藏拍照界面神器

效果

在这里插入图片描述

Code:

//
//  ViewController.m
//  vidio
//
//  Created by bbq on 2019/10/15.
//  Copyright © 2019年 bbq. All rights reserved.
//

#import "ViewController.h"
#import <MobileCoreServices/MobileCoreServices.h>//这个框架是选择媒体类型时需要用到的
#import <AVKit/AVKit.h>
#import <AVFoundation/AVFoundation.h>
#define SCREEN_BOUNDS [UIScreen mainScreen].bounds//屏幕尺寸
#define SCREEN_WIDTH CGRectGetWidth([UIScreen mainScreen].bounds)//屏幕宽
#define SCREEN_HEIGHT CGRectGetHeight([UIScreen mainScreen].bounds)//屏幕高
@interface ViewController ()<UINavigationControllerDelegate,UIImagePickerControllerDelegate>{
    BOOL isMovie;//判断拍照摄像的依据
    UILabel *showTypeLabel;//显示拍照或是录像的控件
    UIImageView *showMediaView;//显示拍照录像结果的视图
    UIImage *customImage;
    int doit;
//    typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraFlashMode) {
//        UIImagePickerControllerCameraFlashModeOff  = -1,
//        UIImagePickerControllerCameraFlashModeAuto = 0,
//        UIImagePickerControllerCameraFlashModeOn   = 1
//    };
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    UISwitch *mediaSwich = [[UISwitch alloc]initWithFrame:CGRectMake(SCREEN_WIDTH - 100, 60, 50, 50)];
    [mediaSwich addTarget:self action:@selector(changeMediaType:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:mediaSwich];
    
    
    showTypeLabel = [[UILabel alloc]initWithFrame:CGRectMake(CGRectGetMinX(mediaSwich.frame), CGRectGetMinY(mediaSwich.frame)+50, 50, 30)];
    showTypeLabel.textAlignment = NSTextAlignmentCenter;
    showTypeLabel.textColor = [UIColor colorWithRed:0.8963 green:0.3301 blue:1.0 alpha:1.0];
    showTypeLabel.text = @"pic";
    [self.view addSubview:showTypeLabel];
    
    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(100, 100, 100, 100);
    [button setTitle:@"黑屏" forState:UIControlStateNormal];
    button.backgroundColor = [UIColor brownColor];
    [button addTarget:self action:@selector(doit) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    //    showMediaView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 200, 200, 200)];
    //    showMediaView.contentMode = UIViewContentModeScaleAspectFill;
    //    [self.view addSubview:showMediaView];
    
    
    UIButton *button2 = [UIButton buttonWithType:UIButtonTypeCustom];
    button2.frame = CGRectMake(100, 250, 100, 100);
    [button2 setTitle:@"小说" forState:UIControlStateNormal];
    button2.backgroundColor = [UIColor brownColor];
    [button2 addTarget:self action:@selector(doit2) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button2];
    //    showMediaView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 200, 200, 200)];
    //    showMediaView.contentMode = UIViewContentModeScaleAspectFill;
    //    [self.view addSubview:showMediaView];
    
    
    UIButton *button3 = [UIButton buttonWithType:UIButtonTypeCustom];
    button3.frame = CGRectMake(100, 400, 100, 100);
    [button3 setTitle:@"自定义" forState:UIControlStateNormal];
    button3.backgroundColor = [UIColor brownColor];
    [button3 addTarget:self action:@selector(doit3) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button3];
//    showMediaView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
//    showMediaView.contentMode = UIViewContentModeScaleAspectFill;
    //    [self.view addSubview:showMediaView];
    
    UIButton *button4 = [UIButton buttonWithType:UIButtonTypeCustom];
    button4.frame = CGRectMake(120, 520, 50, 50);
    [button4 setTitle:@"select" forState:UIControlStateNormal];
    button4.backgroundColor = [UIColor brownColor];
    [button4 addTarget:self action:@selector(doit4) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button4];
    
    UIButton *button6 = [UIButton buttonWithType:UIButtonTypeCustom];
    button6.frame = CGRectMake(40, 520, 50, 50);
    [button6 setTitle:@"select" forState:UIControlStateNormal];
    button6.backgroundColor = [UIColor brownColor];
    [button6 addTarget:self action:@selector(doit6) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button6];
    
    UIButton *button5 = [UIButton buttonWithType:UIButtonTypeCustom];
    button5.frame = CGRectMake(200, 520, 50, 50);
    [button5 setTitle:@"clean" forState:UIControlStateNormal];
    button5.backgroundColor = [UIColor brownColor];
    [button5 addTarget:self action:@selector(doit5) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button5];
}

-(void)changeMediaType:(UISwitch *)sender{
//    [showTypeLabel rotation];
    showTypeLabel.text = sender.isOn!=YES?@"pic":@"movie" ;
    isMovie = sender.isOn;
    
}

-(void)doits:(NSString *)ns{
    UIImagePickerController *pickerController = [[UIImagePickerController alloc]init];
    //选择摄像头设备 默认的是选择相册
    pickerController.sourceType =  UIImagePickerControllerSourceTypeCamera;
    
    pickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
    
    if (isMovie == YES) {
        //拍照的时候不选择mediaTypes不会崩溃是因为默认设置是kUTTypeImage
        //kUTTypeImage包含在MobileCoreServices框架里面->需要的内容不是OC里面字符串的类型需要强制转换
        //录制视频类型要选择kUTTypeMovie 它里面包含了audio和video
        pickerController.mediaTypes = @[(NSString *)kUTTypeMovie];
        //设置录像 默认的是拍照 -> 选择cameraCaptureMode一定要先选择mediaTypes否则会崩溃
        pickerController.cameraCaptureMode =  UIImagePickerControllerCameraCaptureModeVideo;
    }
    UIImageView *anImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:ns]];
    anImageView.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
    //        anImageView.hidden = YES;
    pickerController.cameraOverlayView = anImageView;
    //里面包含两个代理
    pickerController.delegate = self;
    
    [self presentViewController:pickerController animated:YES completion:nil];
    
}

-(void)doit{
    doit = 2;
    NSString *strdo1 = @"Watermark3.png";
    [self doits:strdo1];
}

-(void)doit2{
    doit = 2;
    NSString *strdo1 = @"Watermark4.png";
    [self doits:strdo1];
}

-(void)doit3{
    doit = 2;
    UIImagePickerController *pickerController = [[UIImagePickerController alloc]init];
    //选择摄像头设备 默认的是选择相册
    pickerController.sourceType =  UIImagePickerControllerSourceTypeCamera;
    
    pickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
    
    if (isMovie == YES) {
        //拍照的时候不选择mediaTypes不会崩溃是因为默认设置是kUTTypeImage
        //kUTTypeImage包含在MobileCoreServices框架里面->需要的内容不是OC里面字符串的类型需要强制转换
        //录制视频类型要选择kUTTypeMovie 它里面包含了audio和video
        pickerController.mediaTypes = @[(NSString *)kUTTypeMovie];
        //设置录像 默认的是拍照 -> 选择cameraCaptureMode一定要先选择mediaTypes否则会崩溃
        pickerController.cameraCaptureMode =  UIImagePickerControllerCameraCaptureModeVideo;
    }
    
    UIImageView *anImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Watermark.png"]];
    
    UIImage *cusImage= [self getDocumentImage];
    if(cusImage != nil){
        anImageView = [[UIImageView alloc] initWithImage:cusImage];
    }
    
    anImageView.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
    //        anImageView.hidden = YES;
    pickerController.cameraOverlayView = anImageView;
    //里面包含两个代理
    pickerController.delegate = self;
    
    [self presentViewController:pickerController animated:YES completion:nil];
}

-(void)doit4{
    doit = 1;
    UIImagePickerController *pickerController = [[UIImagePickerController alloc]init];
    //选择摄像头设备 默认的是选择相册
    pickerController.sourceType =  UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    pickerController.delegate = self;
    [self presentViewController:pickerController animated:YES completion:nil];
}

-(void)doit6{
    doit = 1;
    UIImagePickerController *pickerController = [[UIImagePickerController alloc]init];
    //选择摄像头设备 默认的是选择相册
    pickerController.sourceType =  UIImagePickerControllerSourceTypeCamera;
    pickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
    UIImageView *anImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Watermark.png"]];
   
    anImageView.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
    //        anImageView.hidden = YES;
    pickerController.cameraOverlayView = anImageView;
    //里面包含两个代理
    pickerController.delegate = self;
    [self presentViewController:pickerController animated:YES completion:nil];
}

-(void)doit5{
//    NSString *path_sandox = NSHomeDirectory();
    //设置一个图片的存储路径
    NSString *path_sandox = NSHomeDirectory();
    NSString *imagePath = [path_sandox stringByAppendingString:@"/Documents/customImage.png"];
    NSFileManager *mgr = [NSFileManager defaultManager];
    [mgr removeItemAtPath:imagePath error:nil];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
    NSLog(@"录制完成");
    NSLog(@">>:%@",info);
    if ([info[UIImagePickerControllerMediaType]isEqualToString:(NSString *)kUTTypeMovie]) {
        NSLog(@"录像,录制完成");
        NSString *path = (NSString *)[info[UIImagePickerControllerMediaURL] path];
        //保存视频到相册
        UISaveVideoAtPathToSavedPhotosAlbum(path, self, @selector(video:didFinishSavingWithError:contextInfo:), nil) ;
        
    }
    if ([info[UIImagePickerControllerMediaType]isEqualToString:(NSString *)kUTTypeImage] ) {
        UIImage *finishImage = info[UIImagePickerControllerOriginalImage];
//        showMediaView.image = nil;
//        showMediaView.image = finishImage;
        //将图片转换成二进制
        //        NSData *imageData = UIImageJPEGRepresentation(finishImage, 0.1);
        //        NSData *imageData1 = UIImagePNGRepresentation(finishImage);
        //把照片保存到相册
        if(doit == 1){
            NSLog(@"选择自定义背景完成");
            NSString *path_sandox = NSHomeDirectory();
            //设置一个图片的存储路径
            NSString *imagePath = [path_sandox stringByAppendingString:@"/Documents/customImage.png"];
            //把图片直接保存到指定的路径(同时应该把图片的路径imagePath存起来,下次就可以直接用来取)
            [UIImagePNGRepresentation(finishImage) writeToFile:imagePath atomically:YES];
        }else{
            NSLog(@"拍照,拍照完成");
            UIImageWriteToSavedPhotosAlbum(finishImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
            
        }
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}

// 读取
-(UIImage *)getDocumentImage{
    // 读取沙盒路径图片
     NSString *path_sandox = NSHomeDirectory();
     NSString *aPath3=[path_sandox stringByAppendingString:@"/Documents/customImage.png"];
    // 拿到沙盒路径图片
    UIImage *imgFromUrl3=[[UIImage alloc]initWithContentsOfFile:aPath3];
    NSData *imageData = UIImageJPEGRepresentation(imgFromUrl3,1);
    NSLog(@"有缓存%zu",[imageData length]/1024);
    return imgFromUrl3;
    
}

//视频保存到相册之后调用
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
//    AVPlayer *player = [AVPlayer playerWithURL:[NSURL fileURLWithPath:videoPath]];
//    AVPlayerViewController *vc = [[AVPlayerViewController alloc]init];
//    vc.player = player;
//    [self presentViewController:vc animated:YES completion:nil];
    
}
//保存成功就会调用这个方法
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
    NSLog(@"保存成功");
    
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    NSLog(@"取消");
    [self dismissViewControllerAnimated:YES completion:nil];
}


@end

原创文章 6 获赞 18 访问量 3167

猜你喜欢

转载自blog.csdn.net/qq_24054301/article/details/103836911