Tocropviewcontroller: рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдорд╛рд░реНрдЪ 2018  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: TimOliver/TOCropViewController

рдореИрдВ рддреЗрдЬреА рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрдк рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдХрд▓ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдкреЙрдб рдЕрдк рдЯреВ рдбреЗрдЯ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЖрджрдореА рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рд╣реБрдЖ рд╣реИред

рдореИрдВ рд╕рд┐рд░реНрдл рдирдпрд╛ UIViewController рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ UIImageView рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЯреИрдк рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИред рдореАрдбрд┐рдпрд╛ рдкрд┐рдХрд┐рдВрдЧ рдЦрддреНрдо рд╣реЛрдиреЗ рдкрд░ рдореИрдВ UIImagePickerController рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХреНрд░реЙрдк рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ;

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        if let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
            let cropVC = CropViewController(croppingStyle: .circular, image: selectedImage)
            cropVC.delegate = self
            picker.present(cropVC, animated: false, completion: nil)
        } 
    }

рдЗрд╕ UIViewController рдХреЛ рдХреНрд░реЙрдк рдХрд░рдиреЗ рдФрд░ рдЦрд╛рд░рд┐рдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, deinit рдХрднреА рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рддрд░рд╣ imagePickerController рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ рдмрджрд▓ рд░рд╣рд╛ рд╣реВрдБ;

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        if let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
            self.imageView.image = selectedImage
        } 
    }

рддреЛ рдЕрдЧрд░ рдореИрдВ рдЦрд╛рд░рд┐рдЬ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, deinit рдХреЙрд▓ред рдореИрдВ рдпрд╣рд╛рдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЖрдЗрдЯрдо рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛, рдХреЗрд╡рд▓ UIViewController, UIImageView рдФрд░ UIImagePickerControllerред рдХреНрдпрд╛ рдореИрдВрдиреЗ рдХреБрдЫ рдЧрд▓рдд рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рдпрд╣ рдПрдХ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рд╣реИ?

- рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ -

рдЬрдм рдореИрдВ рдЖрдкрдХреА CropViewController.swift рдХрдХреНрд╖рд╛ рдореЗрдВ deinit рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рди рд╣реА рдЗрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдареАрдХ рд╣реИ .. рдореИрдВрдиреЗ рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рддрдп рдХрд┐рдпрд╛ рд╣реИ:
1- рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдХрдордЬреЛрд░ рдмрдирд╛ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдХрдордЬреЛрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
2- рдореИрдВрдиреЗ [рдХрдордЬреЛрд░ рд╕реНрд╡рдпрдВ] рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░ рд╕реНрд╡рдпрдВ рдХреЙрд▓ рдХрд┐рдпрд╛

рдЕрдкрдиреЗ CropViewController.swift рдореЗрдВ onDid... рдХреЙрд▓рдмреИрдХ рджреЗрдЦреЗрдВред

fileprivate func setUpDelegateHandlers() {
        guard let delegate = self.delegate else {
            onDidCropToRect = nil
            onDidCropImageToRect = nil
            onDidCropToCircleImage = nil
            onDidFinishCancelled = nil
            return
        }

        if delegate.responds(to: #selector(CropViewControllerDelegate.cropViewController(_:didCropImageToRect:angle:))) {
            self.onDidCropImageToRect = {[weak self] rect, angle in
                delegate.cropViewController!((self)!, didCropImageToRect: rect, angle: angle)
            }
        }

        if delegate.responds(to: #selector(CropViewControllerDelegate.cropViewController(_:didCropToImage:withRect:angle:))) {
            self.onDidCropToRect = {[weak self] image, rect, angle in
                delegate.cropViewController!((self)!, didCropToImage: image, withRect: rect, angle: angle)
            }
        }

        if delegate.responds(to: #selector(CropViewControllerDelegate.cropViewController(_:didCropToCircularImage:withRect:angle:))) {
            self.onDidCropToCircleImage = {[weak self] image, rect, angle in
                delegate.cropViewController!((self)!, didCropToCircularImage: image, withRect: rect, angle: angle)
            }
        }

        if delegate.responds(to: #selector(CropViewControllerDelegate.cropViewController(_:didFinishCancelled:))) {
            self.onDidFinishCancelled = { [weak self] finished in
                delegate.cropViewController!((self)!, didFinishCancelled: finished)
            }
        }
    }

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рдп @kcankaynak!

рдЙрд╣ рдУрд╣ред рдЖрдк рд╕рд╣реА рд╣реЗред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХреА рддрд░рд╣ рдЧрдВрдз рдХрд░рддрд╛ рд╣реИред рдореМрдХрд╛ рдорд┐рд▓рдиреЗ рдкрд░ рдореБрдЭреЗ рдЗрд╕реЗ рдирдореВрдирд╛ рдРрдк рдореЗрдВ рдЖрдЬрд╝рдорд╛рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдореЗрд░реЗ UIViewController (рд╡рд╣ рдЬреЛ рдЖрдкрдХреА рдлрд╕рд▓ рд╡реАрд╕реА рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ) рдХреЛ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рдПрдХ рд░рдЦрд░рдЦрд╛рд╡ рдЪрдХреНрд░ рд╣реИ, рдпрд╣ deinit рд╡рд┐рдзрд┐ рдХреЛ @kcankaynak рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЖрдкрдХрд╛ рдХреНрд░реЙрдкрд┐рдВрдЧрд╡реАрд╕реА рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрдордЬреЛрд░ рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдкрдХреА рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕рдВрдкрддреНрддрд┐ рдереА

public var delegate: CropViewControllerDelegate? {
        didSet { self.setUpDelegateHandlers() }
    }

рддреЛ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛.. рд╢рд╛рдпрдж

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрдордЬреЛрд░ рд╡рд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐: CropViewControllerDelegate? {
рдбрд┐рдбрд╕реЗрдЯ {self.setUpDelegateHandlers ()}
}

рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреЗрдЧрд╛ ... рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реБрдЖ :(

рдареАрдХ рд╣реИ .. рдореИрдВрдиреЗ рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рддрдп рдХрд┐рдпрд╛ рд╣реИ:
1- рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдХрдордЬреЛрд░ рдмрдирд╛ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдХрдордЬреЛрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
2- рдореИрдВрдиреЗ [рдХрдордЬреЛрд░ рд╕реНрд╡рдпрдВ] рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░ рд╕реНрд╡рдпрдВ рдХреЙрд▓ рдХрд┐рдпрд╛

рдЕрдкрдиреЗ CropViewController.swift рдореЗрдВ onDid... рдХреЙрд▓рдмреИрдХ рджреЗрдЦреЗрдВред

fileprivate func setUpDelegateHandlers() {
        guard let delegate = self.delegate else {
            onDidCropToRect = nil
            onDidCropImageToRect = nil
            onDidCropToCircleImage = nil
            onDidFinishCancelled = nil
            return
        }

        if delegate.responds(to: #selector(CropViewControllerDelegate.cropViewController(_:didCropImageToRect:angle:))) {
            self.onDidCropImageToRect = {[weak self] rect, angle in
                delegate.cropViewController!((self)!, didCropImageToRect: rect, angle: angle)
            }
        }

        if delegate.responds(to: #selector(CropViewControllerDelegate.cropViewController(_:didCropToImage:withRect:angle:))) {
            self.onDidCropToRect = {[weak self] image, rect, angle in
                delegate.cropViewController!((self)!, didCropToImage: image, withRect: rect, angle: angle)
            }
        }

        if delegate.responds(to: #selector(CropViewControllerDelegate.cropViewController(_:didCropToCircularImage:withRect:angle:))) {
            self.onDidCropToCircleImage = {[weak self] image, rect, angle in
                delegate.cropViewController!((self)!, didCropToCircularImage: image, withRect: rect, angle: angle)
            }
        }

        if delegate.responds(to: #selector(CropViewControllerDelegate.cropViewController(_:didFinishCancelled:))) {
            self.onDidFinishCancelled = { [weak self] finished in
                delegate.cropViewController!((self)!, didFinishCancelled: finished)
            }
        }
    }

рдЗрд╕реЗ рджреВрд╕рд░реЗ рдкреАрдЖрд░ рдореЗрдВ рдорд┐рд▓рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

muranobu picture muranobu  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dddOO7 picture dddOO7  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rnkyr picture rnkyr  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

TimOliver picture TimOliver  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

yarodevuci picture yarodevuci  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ