Tocropviewcontroller: TOCropViewController рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдЙрджрд╛рд╣рд░рдг

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рдЬреБрд▓ре░ 2020  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: TimOliver/TOCropViewController

рдирдорд╕реНрддреЗ, рдХреНрдпрд╛ TOCropViewController рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИ? рдореИрдВрдиреЗ рдЕрднреА рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ UIViewcontroller рдХрд╛ рдХреЛрдИ рдкрд┐рдЫрд▓рд╛ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЬрд╛рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред

pr requested question

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

рдирдорд╕реНрддреЗ,
рдореИрдВрдиреЗ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП "рдЗрдВрдЯрд░рдлрд╝реЗрд╕" TOCropViewControllerред рдореИрдВрдиреЗ рдЕрднреА рдЕрдкрдирд╛ iOS рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдПрдбрд╡реЗрдВрдЪрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЛрдб рд╢рд╛рдпрдж рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕ рд░реЗрдкреЛ рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

// FIle: ImageCropper.swift

import SwiftUI
import UIKit
import CropViewController

struct ImageCropper: UIViewControllerRepresentable{
  <strong i="7">@Binding</strong> var image: UIImage?
  <strong i="8">@Binding</strong> var visible: Bool
  var done: (UIImage) -> Void

  class Coordinator: NSObject, CropViewControllerDelegate{
    let parent: ImageCropper

    init(_ parent: ImageCropper){
      self.parent = parent
    }

    func cropViewController(_ cropViewController: CropViewController, didCropToImage image: UIImage, withRect cropRect: CGRect, angle: Int) {
      withAnimation{
        parent.visible = false
      }
      parent.done(image)
    }

    func cropViewController(_ cropViewController: CropViewController, didFinishCancelled cancelled: Bool) {
      withAnimation{
        parent.visible = false
      }
    }
  }

  func makeCoordinator() -> Coordinator {
    return Coordinator(self)
  }

  func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {}

  func makeUIViewController(context: Context) -> some UIViewController {
    let img = self.image ?? UIImage()
    let cropViewController = CropViewController(image: img)
    cropViewController.delegate = context.coordinator
    return cropViewController
  }
}

рдЙрдкрдпреЛрдЧ:

// FIle: SomeView.swift
import SwiftUI

struct SomeView: View {
  <strong i="12">@State</strong> private var showImageCropper = false
  <strong i="13">@State</strong> private var tempInputImage: UIImage?

  func imageCropped(image: UIImage){
    self.tempInputImage = nil
    self.pictures[self.pickedImageIndex] = Image(uiImage: image)
  }

  var body: some View {
    if showImageCropper {
      ImageCropper(image: self.$tempInputImage, visible: self.$showImageCropper, done: self.imageCropped)
        .zIndex(10)
    }
  }
}

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

рд╣рд╛рдп @ClaesClaes! рдЕрд░реЗ рд╡рд╛рд╣! рддрдм рд╕реНрд╡рд┐рдлреНрдЯ рд╕рдореБрджрд╛рдп рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдкрд╣рд▓реЗ рдпрд╣ рдкреВрдЫрд╛ рд╣реИред рдРрдкреНрдкрд▓ рдиреЗ рдХреБрдЫ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЬрд╛рд░реА рдХрд┐рдП рд╣реИрдВ рдЬреЛ рдЙрдореНрдореАрдж рд╕реЗ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ: https://developer.apple.com/tutorials/swiftui/interfacing-with-uikit

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ (рдореИрдВ рдЕрднреА рднреА рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдпреВрдЖрдИрдХрд┐рдЯ рдХреЗ рд╕рд╛рде рдЪрд┐рдкрдХрд╛ рд╣реБрдЖ рд╣реВрдВред :)), рдЗрд╕рд▓рд┐рдП рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рд╕рдордп рд╕реАрдЦрдиреЗ рдФрд░ рдлрд┐рд░ рдПрдХ рдирдореВрдирд╛ рдРрдк рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ред

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ "рдкреАрдЖрд░ рдЕрдиреБрд░реЛрдзрд┐рдд" рд╕реНрдерд┐рддрд┐ рд╕рдВрд▓рдЧреНрди рдХрд░рдХреЗ рдЦреБрд▓рд╛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдирдореВрдирд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред :)

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдорджрдж рдХрд░реЗрдВрдЧреЗ!

рд╣рд╛рдп рдЯрд┐рдо,
рдЖрдкрдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ TOCropViewController рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдмреА рд╣рд╛рд╕рд┐рд▓ рдХреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ (рдЬреНрдпрд╛рджрд╛рддрд░) рдЕрднреА рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рд╕рдордп рдорд┐рд▓рдиреЗ рдкрд░ рдореИрдВ рдХреБрдЫ рдХреЛрдб + рдирд┐рд░реНрджреЗрд╢ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдЪреАрдпрд░реНрд╕,
рдХреНрд▓реЗрд╕

20 рдЬреБрд▓рд╛рдИ, 2020 рдХреЛ рджреЛрдкрд╣рд░ 2:37 рдмрдЬреЗ, рдЯрд┐рдо рдУрд▓рд┐рд╡рд░ рдиреЗ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рд▓рд┐рдЦрд╛:

рд╣рд╛рдп @ClaesClaes https://github.com/ClaesClaes ! рдЕрд░реЗ рд╡рд╛рд╣! рддрдм рд╕реНрд╡рд┐рдлреНрдЯ рд╕рдореБрджрд╛рдп рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдкрд╣рд▓реЗ рдпрд╣ рдкреВрдЫрд╛ рд╣реИред рдРрдкреНрдкрд▓ рдиреЗ рдХреБрдЫ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЬрд╛рд░реА рдХрд┐рдП рд╣реИрдВ рдЬреЛ рдЙрдореНрдореАрдж рд╕реЗ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ: https://developer.apple.com/tutorials/swiftui/interfacing-with-uikit https://developer.apple.com/tutorials/swiftui/interfacing-with- uikit
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ (рдореИрдВ рдЕрднреА рднреА рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдпреВрдЖрдИрдХрд┐рдЯ рдХреЗ рд╕рд╛рде рдЪрд┐рдкрдХрд╛ рд╣реБрдЖ рд╣реВрдВред :)), рдЗрд╕рд▓рд┐рдП рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рд╕рдордп рд╕реАрдЦрдиреЗ рдФрд░ рдлрд┐рд░ рдПрдХ рдирдореВрдирд╛ рдРрдк рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ред

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ "рдкреАрдЖрд░ рдЕрдиреБрд░реЛрдзрд┐рдд" рд╕реНрдерд┐рддрд┐ рд╕рдВрд▓рдЧреНрди рдХрд░рдХреЗ рдЦреБрд▓рд╛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдирдореВрдирд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред :)

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub https://github.com/TimOliver/TOCropViewController/issues/421#issuecomment-660858630 рдкрд░ https://github.com/notifications/unsubscribe-auth/ACOX6SWCSSAJWXCJ7KUWH2LR4PX2NANCNFSM4OZHUWVQ рдХреЛ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм

рд╣рд╛рдп, @ClaesClaes !
рдореИрдВрдиреЗ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЗ рд╕рд╛рде 'TOCropViewController' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдореВрдирд╛ рдРрдк рдмрдирд╛рдпрд╛ рд╣реИред

рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИ рдЬрд╣рд╛рдВ 'TOCropViewController' рдХреЛ рддрдм рддрдХ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдЬрдм рддрдХ рдХрд┐ рдЖрдк 'UIImagePickerController' рд╕реЗ 'TOCropViewController' рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХрд░рддреЗ рд╕рдордп 1 рд╕реЗрдХрдВрдб рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рди рдХрд░реЗрдВред рдЖрдкрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ?

  • рдПрдХреНрд╕рдХреЛрдб 11.6 / рдЖрдИрдУрдПрд╕ 13.6

рд╣рд╛рдп рдХреЗрдВрдЬреА,
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЗрддрдиреА рджреЗрд░реА рдирд╣реАрдВ рджреЗрдЦреА рд╣реИред рдореИрдВ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред

рдХреНрд▓реЗрд╕

рдореЗрд░реЗ рдлреЛрди рд╕реЗ рднреЗрдЬрд╛ рдЧрдпрд╛ред рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдФрд░ рд╡рд░реНрддрдиреА рдХреА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛

25 рдЬреБрд▓рд╛рдИ 2020 рдХреЛ 22:12 рдмрдЬреЗ рдХреЗрдВрдЬреА рд╡рд╛рдбрд╛ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:


рд╣рд╛рдп, @ClaesClaes !
рдореИрдВрдиреЗ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЗ рд╕рд╛рде 'TOCropViewController' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдореВрдирд╛ рдРрдк рдмрдирд╛рдпрд╛ рд╣реИред

https://github.com/CH3COOH/TOCropViewController/tree/issue/421
рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИ рдЬрд╣рд╛рдВ 'TOCropViewController' рдХреЛ рддрдм рддрдХ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдЬрдм рддрдХ рдХрд┐ рдЖрдк 'UIImagePickerController' рд╕реЗ 'TOCropViewController' рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХрд░рддреЗ рд╕рдордп 1 рд╕реЗрдХрдВрдб рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рди рдХрд░реЗрдВред рдЖрдкрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ?

рдПрдХреНрд╕рдХреЛрдб 11.6 / рдЖрдИрдУрдПрд╕ 13.6
-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ, рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВред

рдирдорд╕реНрддреЗ,
рдореИрдВрдиреЗ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП "рдЗрдВрдЯрд░рдлрд╝реЗрд╕" TOCropViewControllerред рдореИрдВрдиреЗ рдЕрднреА рдЕрдкрдирд╛ iOS рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдПрдбрд╡реЗрдВрдЪрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЛрдб рд╢рд╛рдпрдж рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕ рд░реЗрдкреЛ рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

// FIle: ImageCropper.swift

import SwiftUI
import UIKit
import CropViewController

struct ImageCropper: UIViewControllerRepresentable{
  <strong i="7">@Binding</strong> var image: UIImage?
  <strong i="8">@Binding</strong> var visible: Bool
  var done: (UIImage) -> Void

  class Coordinator: NSObject, CropViewControllerDelegate{
    let parent: ImageCropper

    init(_ parent: ImageCropper){
      self.parent = parent
    }

    func cropViewController(_ cropViewController: CropViewController, didCropToImage image: UIImage, withRect cropRect: CGRect, angle: Int) {
      withAnimation{
        parent.visible = false
      }
      parent.done(image)
    }

    func cropViewController(_ cropViewController: CropViewController, didFinishCancelled cancelled: Bool) {
      withAnimation{
        parent.visible = false
      }
    }
  }

  func makeCoordinator() -> Coordinator {
    return Coordinator(self)
  }

  func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {}

  func makeUIViewController(context: Context) -> some UIViewController {
    let img = self.image ?? UIImage()
    let cropViewController = CropViewController(image: img)
    cropViewController.delegate = context.coordinator
    return cropViewController
  }
}

рдЙрдкрдпреЛрдЧ:

// FIle: SomeView.swift
import SwiftUI

struct SomeView: View {
  <strong i="12">@State</strong> private var showImageCropper = false
  <strong i="13">@State</strong> private var tempInputImage: UIImage?

  func imageCropped(image: UIImage){
    self.tempInputImage = nil
    self.pictures[self.pickedImageIndex] = Image(uiImage: image)
  }

  var body: some View {
    if showImageCropper {
      ImageCropper(image: self.$tempInputImage, visible: self.$showImageCropper, done: self.imageCropped)
        .zIndex(10)
    }
  }
}

рдирдорд╕реНрддреЗ,
рдореИрдВрдиреЗ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП "рдЗрдВрдЯрд░рдлрд╝реЗрд╕" TOCropViewControllerред рдореИрдВрдиреЗ рдЕрднреА рдЕрдкрдирд╛ iOS рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдПрдбрд╡реЗрдВрдЪрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЛрдб рд╢рд╛рдпрдж рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕ рд░реЗрдкреЛ рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

// FIle: ImageCropper.swift

import SwiftUI
import UIKit
import CropViewController

struct ImageCropper: UIViewControllerRepresentable{
  <strong i="8">@Binding</strong> var image: UIImage?
  <strong i="9">@Binding</strong> var visible: Bool
  var done: (UIImage) -> Void

  class Coordinator: NSObject, CropViewControllerDelegate{
    let parent: ImageCropper

    init(_ parent: ImageCropper){
      self.parent = parent
    }

    func cropViewController(_ cropViewController: CropViewController, didCropToImage image: UIImage, withRect cropRect: CGRect, angle: Int) {
      withAnimation{
        parent.visible = false
      }
      parent.done(image)
    }

    func cropViewController(_ cropViewController: CropViewController, didFinishCancelled cancelled: Bool) {
      withAnimation{
        parent.visible = false
      }
    }
  }

  func makeCoordinator() -> Coordinator {
    return Coordinator(self)
  }

  func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {}

  func makeUIViewController(context: Context) -> some UIViewController {
    let img = self.image ?? UIImage()
    let cropViewController = CropViewController(image: img)
    cropViewController.delegate = context.coordinator
    return cropViewController
  }
}

рдЙрдкрдпреЛрдЧ:

// FIle: SomeView.swift
import SwiftUI

struct SomeView: View {
  <strong i="13">@State</strong> private var showImageCropper = false
  <strong i="14">@State</strong> private var tempInputImage: UIImage?

  func imageCropped(image: UIImage){
    self.tempInputImage = nil
    self.pictures[self.pickedImageIndex] = Image(uiImage: image)
  }

  var body: some View {
    if showImageCropper {
      ImageCropper(image: self.$tempInputImage, visible: self.$showImageCropper, done: self.imageCropped)
        .zIndex(10)
    }
  }
}

func рдХреНрд░реЙрдк рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ (_ рдХреНрд░реЙрдк рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░: рдХреНрд░реЙрдк рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░, рдбреАрдбрдХреНрд░реЙрдкрдЯреЛрдЗрдореЗрдЬ рдЗрдореЗрдЬ: рдпреВрдЖрдИрдПрдордореЗрдЬ, рд╡рд┐рдж рд░реЗрдХреНрдЯ рдХреНрд░реЙрдкрд░реЗрдХреНрдЯ: рд╕реАрдЬреАрдЖрд░рдИрдЯреА, рдПрдВрдЧрд▓: рдЗрдВрдЯ) {
рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд┐рдпрд╛ (рдЫрд╡рд┐)

    // some how, there maybe a bug, it can not be dismissed except adding this
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
        withAnimation{
            self.parent.visible = false
        }
    }
}
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕