点击按钮添加照片(拍照/相册)普通需求只需调用系统的就可以了
1、创建一个UIImagePickerController 并引入头文件
#import
#import
@property (nonatomic, strong) UIImagePickerController *imagePickerController;
#pragma mark- 懒加载
- (UIImagePickerController *)imagePickerController {
if (_imagePickerController == nil) {
_imagePickerController = [[UIImagePickerController alloc] init];
_imagePickerController.delegate = self; //delegate遵循了代理
_imagePickerController.allowsEditing = YES;//开启剪切框(默认是NO)
}
return _imagePickerController;
}
2、从底部弹出选择框(相册/相机/取消)
- (void)imageViewIsSelector {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *camera = [UIAlertAction actionWithTitle:@"相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self checkCameraPermission];//调用检查相机权限方法
}];
UIAlertAction *album = [UIAlertAction actionWithTitle:@"相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self checkAlbumPermission];//调起检查相册权限方法
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) {
[self dismissViewControllerAnimated:YES completion:nil];
}];
[alert addAction:camera];
[alert addAction:album];
[alert addAction:cancel];
[self presentViewController:alert animated:YES completion:nil];
}
3、选择相册/相机
#pragma mark - Camera(检查相机权限方法)
- (void)checkCameraPermission {
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (status == AVAuthorizationStatusNotDetermined) {
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if(granted) {
[self takePhoto];
}
}];
}else if (status == AVAuthorizationStatusDenied || status == AVAuthorizationStatusRestricted) {
//如果没有权限给出提示
}else{
[self takePhoto];//有权限
}
}
-(void)takePhoto{
//判断相机是否可用,如果可用调起
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
self.imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:self.imagePickerController animated:YES completion:^{
}];
}else{
NSLog(@"没有相机");
}
}
//相册流程与相机流程相同,相册是不存在硬件问题的
- (void)checkAlbumPermission {
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusNotDetermined) {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
dispatch_async(dispatch_get_main_queue(), ^{
if(status ==PHAuthorizationStatusAuthorized) {
[self selectAlbum];
}
});
}];
}else if (status == PHAuthorizationStatusDenied || status == PHAuthorizationStatusRestricted) {
//如果没有权限给出提示
}else{
[selfselectAlbum];
}
}
- (void)selectAlbum {
//判断相册是否可用
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
self.imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:self.imagePickerController animated:YES completion:^{
}];
}
}
4、选择完成触发代理
//最后一步,选完就把图片加上就完事了
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary
[picker dismissViewControllerAnimated:YES completion:nil];
UIImage *image = [info valueForKey:@"UIImagePickerControllerOriginalImage"];
image = [selffixOrientation:image] ;//选择拍照后图片会翻转(调用这个方法翻回来)
//imagePickerController.allowsEditing 设置为YES,剪切后的图片比例是1:1 ,如果需要剪切不同的尺寸,请在懒加载中把allowsEditing设置为NO,并调用下面图片剪切的方法(下面的250是你想要剪切的图片的宽,160是你想要剪切的图片的高,替换掉即可)
if(image.size.height>160*image.size.width/250) {
image = [self imageCutWithOriginalImage:imagewithCutRect:CGRectMake(0, (image.size.height-160*image.size.width/250)*0.5, image.size.width,160*image.size.width/250)];
}else{
image = [self imageCutWithOriginalImage:imagewithCutRect:CGRectMake((image.size.width-250*image.size.height/160)*0.5,0,250*image.size.height/160,image.size.height)];
}
NSData* pictureData =UIImageJPEGRepresentation(image,1.0);
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[self.imagePickerController dismissViewControllerAnimated:YES completion:nil] ;
}
//判断图片是否翻转(翻转的话 给转回来..)
- (UIImage*)fixOrientation:(UIImage*)aImage {
if (aImage.imageOrientation == UIImageOrientationUp)
return aImage;
CGAffineTransform transform = CGAffineTransformIdentity;
switch(aImage.imageOrientation) {
case UIImageOrientationDown:
case UIImageOrientationDownMirrored:
transform =CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
transform =CGAffineTransformRotate(transform,M_PI);
break;
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
transform =CGAffineTransformTranslate(transform, aImage.size.width,0);
transform =CGAffineTransformRotate(transform,M_PI_2);
break;
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
transform =CGAffineTransformTranslate(transform,0, aImage.size.height);
transform =CGAffineTransformRotate(transform, -M_PI_2);
break;
default:
break;
}
switch(aImage.imageOrientation) {
case UIImageOrientationUpMirrored:
case UIImageOrientationDownMirrored:
transform =CGAffineTransformTranslate(transform, aImage.size.width,0);
transform =CGAffineTransformScale(transform, -1,1);
break;
case UIImageOrientationLeftMirrored:
case UIImageOrientationRightMirrored:
transform =CGAffineTransformTranslate(transform, aImage.size.height,0);
transform =CGAffineTransformScale(transform, -1,1);
break;
default:
break;
}
CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,
CGImageGetBitsPerComponent(aImage.CGImage),0,
CGImageGetColorSpace(aImage.CGImage),
CGImageGetBitmapInfo(aImage.CGImage));
CGContextConcatCTM(ctx, transform);
switch(aImage.imageOrientation) {
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);
break;
default:
CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);
break;
}
CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
UIImage*img = [UIImageimageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
returnimg;
}
//图片剪切
- (UIImage *)imageCutWithOriginalImage:(UIImage *)originalImage withCutRect:(CGRect)rect {
CGImageRefsubImageRef =CGImageCreateWithImageInRect(originalImage.CGImage, rect);
CGRectsmallRect =CGRectMake(0,0,CGImageGetWidth(subImageRef),CGImageGetHeight(subImageRef));
UIGraphicsBeginImageContext(smallRect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, smallRect, subImageRef);
UIImage* image = [UIImageimageWithCGImage:subImageRef];
UIGraphicsEndImageContext();
CGImageRelease(subImageRef);
return image;
}