You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

120 lines
3.6 KiB

//
// 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
}
}