// // ImageCroper.swift // // // Created by shishir sapkota // import Foundation import RSKImageCropper protocol ImageCropperDelegate { func didCropWith(image: UIImage) func didFailedCropWith(error: Error) } class ImageCroper: NSObject { var imageCropper: RSKImageCropViewController = RSKImageCropViewController() weak var presentingViewController: UIViewController? var delegate: ImageCropperDelegate? fileprivate var cropRatio: CGFloat = 1 init(presentingViewController: UIViewController) { super.init() self.presentingViewController = presentingViewController self.imageCropper.delegate = self self.imageCropper.dataSource = self } func cropImage(image: UIImage, ratio: CGFloat = 1) { self.cropRatio = ratio self.imageCropper = RSKImageCropViewController(image: image, cropMode: .custom) imageCropper.chooseButton.setTitle("done_text", for: .normal) self.imageCropper.delegate = self self.imageCropper.dataSource = self self.presentingViewController?.present(imageCropper, animated: true, completion: nil) } } extension ImageCroper: RSKImageCropViewControllerDelegate { func imageCropViewControllerDidCancelCrop(_ controller: RSKImageCropViewController) { presentingViewController?.dismiss(animated: true, completion: nil) } func imageCropViewController(_ controller: RSKImageCropViewController, didCropImage croppedImage: UIImage, usingCropRect cropRect: CGRect) { presentingViewController?.dismiss(animated: true, completion: { // image cropped here self.delegate?.didCropWith(image: croppedImage) }) } func imageCropViewController(_ controller: RSKImageCropViewController, didCropImage croppedImage: UIImage, usingCropRect cropRect: CGRect, rotationAngle: CGFloat) { self.delegate?.didCropWith(image: croppedImage) self.imageCropper.dismiss(animated: true, completion: nil) } } extension ImageCroper: RSKImageCropViewControllerDataSource { func imageCropViewControllerCustomMaskRect(_ controller: RSKImageCropViewController) -> CGRect { guard let viewController = presentingViewController else {return CGRect.zero} var maskSize:CGSize let heightRatio: CGFloat = self.cropRatio //35/71 let maskWidth:CGFloat = UIScreen.main.bounds.size.width - 40 let maskHeight: CGFloat = CGFloat( ceilf( Float(maskWidth * heightRatio))) maskSize = CGSize(width: maskWidth, height: maskHeight) let maskRect: CGRect = CGRect(x: (viewController.view.frame.size.width - maskSize.width ) * 0.5, y: (viewController.view.frame.size.height - maskSize.height) * 0.5, width: maskSize.width, height: maskSize.height) return maskRect } func imageCropViewControllerCustomMaskPath(_ controller: RSKImageCropViewController) -> UIBezierPath { let rect = controller.maskRect; let point1 = CGPoint(x: rect.minX,y: rect.minY); let point2 = CGPoint(x: rect.maxX, y: rect.minY); let point3 = CGPoint(x: rect.maxX, y: rect.maxY); let point4 = CGPoint(x: rect.minX, y: rect.maxY); let rectangle = UIBezierPath() rectangle.move(to: point1) rectangle.addLine(to: point2) rectangle.addLine(to: point3) rectangle.addLine(to: point4) rectangle.close() return rectangle; } func imageCropViewControllerCustomMovementRect(_ controller: RSKImageCropViewController) -> CGRect { return controller.maskRect } }