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.
113 lines
3.7 KiB
113 lines
3.7 KiB
//
|
|
// ImageCroper.swift
|
|
//
|
|
//
|
|
// Created by shishir sapkota
|
|
//
|
|
|
|
import Foundation
|
|
import RSKImageCropper
|
|
import Localize_Swift
|
|
|
|
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".localized(), 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
|
|
}
|
|
}
|
|
|