在iOS开发过程中,经常会遇到上传图片的需求,有时获取到图片之后需要裁剪一下,而系统提供的方法只能裁剪出一个正方形。本文就把实现图片裁剪的方法写出来,供大家参考。
效果:
实现:
首先要介绍一个图片裁剪的三方库RSKImageCropper。支持cocoapods导入,使用起来非常方便。
1.正常调用UIImagePickerController
// 跳转到相册页面
self.picker = [[UIImagePickerController alloc] init];
self.picker.delegate = self;
self.picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//不允许编辑
self.picker.allowsEditing = NO;
[self presentViewController:self.picker animated:YES completion:^{
self.picker = nil;
}];
注意:allowsEditing要设置为NO,否则系统也会弹出页面
2.在UIImagePickerController代理方法中创建裁剪控制器并设置代理、数据源
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *resultImage = [info objectForKey:UIImagePickerControllerOriginalImage];
RSKImageCropViewController *imageCropVC = [[RSKImageCropViewController alloc] initWithImage:resultImage cropMode:RSKImageCropModeCustom];
imageCropVC.delegate = self;
imageCropVC.dataSource = self;
[picker pushViewController:imageCropVC animated:YES];
}
注意:cropMode是RSKImageCropModeCustom的情况下需要设置数据源。
3.实现裁剪控制器的代理方法
/**
取消裁剪
*/
- (void)imageCropViewControllerDidCancelCrop:(RSKImageCropViewController *)controller;
/**
图片将要被裁剪
*/
- (void)imageCropViewController:(RSKImageCropViewController *)controller willCropImage:(UIImage *)originalImage;
/**
图片已经被裁剪,并返回裁剪完的图片和裁剪区域
*/
- (void)imageCropViewController:(RSKImageCropViewController *)controller didCropImage:(UIImage *)croppedImage usingCropRect:(CGRect)cropRect;
/**
图片已经被裁剪,并返回裁剪完的图片、裁剪区域和旋转弧度
*/
- (void)imageCropViewController:(RSKImageCropViewController *)controller didCropImage:(UIImage *)croppedImage usingCropRect:(CGRect)cropRect rotationAngle:(CGFloat)rotationAngle;
注意:下面两个代理方法实现其中一个即可,都实现了也只有最下面的方法会被执行。
4.实现裁剪控制器的数据源方法
/**
返回一个自定义矩形用来裁剪图片
仅在RSKImageCropModeCustom下有效
*/
- (CGRect)imageCropViewControllerCustomMaskRect:(RSKImageCropViewController *)controller;
/**
返回一个自定义路径用来裁剪蒙版
仅在RSKImageCropModeCustom下有效
*/
- (UIBezierPath *)imageCropViewControllerCustomMaskPath:(RSKImageCropViewController *)controller;
@optional
/**
返回一个图片可以移动的矩形区域
仅在RSKImageCropModeCustom下有效
如果你想支持图片旋转,则必须实现该方法
*/
- (CGRect)imageCropViewControllerCustomMovementRect:(RSKImageCropViewController *)controller
{
return controller.maskRect;
}
注意:虽然可以通过返回UIBezierPath展示不同形状的效果,但裁剪还是以返回的CGRect为准。建议返回相同的区域。