// // ImageCroper.swift // // // Created by shishir sapkota // import Foundation import RSKImageCropper import Localize_Swift protocol ImageCropperDelegate: class { func didCropWith(image: UIImage) func didFailedCropWith(error: Error) } class ImageCroper: NSObject { var imageCropper: RSKImageCropViewController = RSKImageCropViewController() weak var presentingViewController: UIViewController? weak 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".localized(), for: .normal) imageCropper.cancelButton.setTitle("cancel_text".localized(), for: .normal) self.imageCropper.delegate = self self.imageCropper.dataSource = self self.imageCropper.modalPresentationStyle = .overFullScreen 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( 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 } }