From 4321d5dfee2f960fb3e5fb62755121480d245c29 Mon Sep 17 00:00:00 2001 From: CypherPoet Date: Fri, 29 Nov 2019 13:52:13 -0600 Subject: [PATCH] Implement UIImagePickerWrapper Coordinator functionality --- .../Instafilter.xcodeproj/project.pbxproj | 14 +++++- .../contents.xcworkspacedata | 2 +- .../UIImagePickerWrapper+Coordinator.swift | 43 +++++++++++++++++++ .../UIImagePickerWrapper.swift | 33 ++++++++++---- .../Scenes/ImageFilteringContainerView.swift | 2 +- 5 files changed, 83 insertions(+), 11 deletions(-) create mode 100644 day-062/Projects/Instafilter/Instafilter/Reusables/Views/UIImagePickerWrapper/UIImagePickerWrapper+Coordinator.swift rename day-062/Projects/Instafilter/Instafilter/Reusables/Views/{ => UIImagePickerWrapper}/UIImagePickerWrapper.swift (51%) diff --git a/day-062/Projects/Instafilter/Instafilter.xcodeproj/project.pbxproj b/day-062/Projects/Instafilter/Instafilter.xcodeproj/project.pbxproj index ae91ce8..f0ad3c5 100644 --- a/day-062/Projects/Instafilter/Instafilter.xcodeproj/project.pbxproj +++ b/day-062/Projects/Instafilter/Instafilter.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ F329953023908CB500D2D963 /* ImageFilteringViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F329952F23908CB500D2D963 /* ImageFilteringViewModel.swift */; }; F32995322390C29100D2D963 /* ImageFilteringContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F32995312390C29100D2D963 /* ImageFilteringContainerView.swift */; }; F3299535239181A900D2D963 /* UIImagePickerWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3299534239181A900D2D963 /* UIImagePickerWrapper.swift */; }; + F329953723919B6700D2D963 /* UIImagePickerWrapper+Coordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F329953623919B6700D2D963 /* UIImagePickerWrapper+Coordinator.swift */; }; F352424E238F3F18009DF1F9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F352424D238F3F18009DF1F9 /* AppDelegate.swift */; }; F3524250238F3F18009DF1F9 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F352424F238F3F18009DF1F9 /* SceneDelegate.swift */; }; F3524254238F3F19009DF1F9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F3524253238F3F19009DF1F9 /* Assets.xcassets */; }; @@ -26,6 +27,7 @@ F329952F23908CB500D2D963 /* ImageFilteringViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageFilteringViewModel.swift; sourceTree = ""; }; F32995312390C29100D2D963 /* ImageFilteringContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageFilteringContainerView.swift; sourceTree = ""; }; F3299534239181A900D2D963 /* UIImagePickerWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIImagePickerWrapper.swift; sourceTree = ""; }; + F329953623919B6700D2D963 /* UIImagePickerWrapper+Coordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImagePickerWrapper+Coordinator.swift"; sourceTree = ""; }; F352424A238F3F18009DF1F9 /* Instafilter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Instafilter.app; sourceTree = BUILT_PRODUCTS_DIR; }; F352424D238F3F18009DF1F9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; F352424F238F3F18009DF1F9 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -52,11 +54,20 @@ F32995332391817800D2D963 /* Views */ = { isa = PBXGroup; children = ( - F3299534239181A900D2D963 /* UIImagePickerWrapper.swift */, + F329953823919C0B00D2D963 /* UIImagePickerWrapper */, ); path = Views; sourceTree = ""; }; + F329953823919C0B00D2D963 /* UIImagePickerWrapper */ = { + isa = PBXGroup; + children = ( + F3299534239181A900D2D963 /* UIImagePickerWrapper.swift */, + F329953623919B6700D2D963 /* UIImagePickerWrapper+Coordinator.swift */, + ); + path = UIImagePickerWrapper; + sourceTree = ""; + }; F3524241238F3F18009DF1F9 = { isa = PBXGroup; children = ( @@ -218,6 +229,7 @@ buildActionMask = 2147483647; files = ( F3F566AF238F6556009E1FB0 /* ImageFilteringService.swift in Sources */, + F329953723919B6700D2D963 /* UIImagePickerWrapper+Coordinator.swift in Sources */, F329952E23908BD400D2D963 /* ImageFilteringView.swift in Sources */, F32995322390C29100D2D963 /* ImageFilteringContainerView.swift in Sources */, F352424E238F3F18009DF1F9 /* AppDelegate.swift in Sources */, diff --git a/day-062/Projects/Instafilter/Instafilter.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/day-062/Projects/Instafilter/Instafilter.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 7a8b225..919434a 100644 --- a/day-062/Projects/Instafilter/Instafilter.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/day-062/Projects/Instafilter/Instafilter.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/day-062/Projects/Instafilter/Instafilter/Reusables/Views/UIImagePickerWrapper/UIImagePickerWrapper+Coordinator.swift b/day-062/Projects/Instafilter/Instafilter/Reusables/Views/UIImagePickerWrapper/UIImagePickerWrapper+Coordinator.swift new file mode 100644 index 0000000..3ff9703 --- /dev/null +++ b/day-062/Projects/Instafilter/Instafilter/Reusables/Views/UIImagePickerWrapper/UIImagePickerWrapper+Coordinator.swift @@ -0,0 +1,43 @@ +// +// UIImagePickerWrapper+Coordinator.swift +// Instafilter +// +// Created by CypherPoet on 11/29/19. +// ✌️ +// + +import Foundation +import UIKit +import SwiftUI + + +extension UIImagePickerWrapper { + + class Coordinator: NSObject { + let onSelect: ((UIImage?) -> Void) + + init(onSelect: @escaping ((UIImage?) -> Void)) { + self.onSelect = onSelect + } + } +} + + + +// MARK: - UIImagePickerControllerDelegate +extension UIImagePickerWrapper.Coordinator: UIImagePickerControllerDelegate { + + func imagePickerController( + _ picker: UIImagePickerController, + didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any] + ) { + let selectedImage = (info[.editedImage] ?? info[.originalImage]) as? UIImage + + onSelect(selectedImage) + } +} + + + +// MARK: - UINavigationControllerDelegate +extension UIImagePickerWrapper.Coordinator: UINavigationControllerDelegate {} diff --git a/day-062/Projects/Instafilter/Instafilter/Reusables/Views/UIImagePickerWrapper.swift b/day-062/Projects/Instafilter/Instafilter/Reusables/Views/UIImagePickerWrapper/UIImagePickerWrapper.swift similarity index 51% rename from day-062/Projects/Instafilter/Instafilter/Reusables/Views/UIImagePickerWrapper.swift rename to day-062/Projects/Instafilter/Instafilter/Reusables/Views/UIImagePickerWrapper/UIImagePickerWrapper.swift index ce0200d..5941d57 100644 --- a/day-062/Projects/Instafilter/Instafilter/Reusables/Views/UIImagePickerWrapper.swift +++ b/day-062/Projects/Instafilter/Instafilter/Reusables/Views/UIImagePickerWrapper/UIImagePickerWrapper.swift @@ -12,21 +12,31 @@ import SwiftUI struct UIImagePickerWrapper { typealias UIViewControllerType = UIImagePickerController + @Environment(\.presentationMode) var presentationMode + @Binding var selectedImage: UIImage? } // MARK: - UIViewControllerRepresentable extension UIImagePickerWrapper: UIViewControllerRepresentable { + func makeCoordinator() -> UIImagePickerWrapper.Coordinator { + Self.Coordinator(onSelect: imageSelected) + } + + func makeUIViewController( context: UIViewControllerRepresentableContext ) -> UIImagePickerController { - UIImagePickerController() + let picker = UIImagePickerController() + + picker.delegate = context.coordinator + + return picker } - func updateUIViewController( _ imagePickerController: UIImagePickerController, context: UIViewControllerRepresentableContext @@ -36,12 +46,19 @@ extension UIImagePickerWrapper: UIViewControllerRepresentable { } +private extension UIImagePickerWrapper { + + func imageSelected(_ image: UIImage?) { + selectedImage = image + presentationMode.wrappedValue.dismiss() + } +} // MARK: - Preview -struct UIImagePickerWrapper_Previews: PreviewProvider { - - static var previews: some View { - UIImagePickerWrapper() - } -} +//struct UIImagePickerWrapper_Previews: PreviewProvider { +// +// static var previews: some View { +// UIImagePickerWrapper() +// } +//} diff --git a/day-062/Projects/Instafilter/Instafilter/Scenes/ImageFilteringContainerView.swift b/day-062/Projects/Instafilter/Instafilter/Scenes/ImageFilteringContainerView.swift index 4592e43..b98e874 100644 --- a/day-062/Projects/Instafilter/Instafilter/Scenes/ImageFilteringContainerView.swift +++ b/day-062/Projects/Instafilter/Instafilter/Scenes/ImageFilteringContainerView.swift @@ -30,7 +30,7 @@ extension ImageFilteringContainerView { Spacer() } .sheet(isPresented: $isShowingImagePicker) { - UIImagePickerWrapper() + UIImagePickerWrapper(selectedImage: self.$currentInputImage) } } }